<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Paulo Rabelo's Blog]]></title><description><![CDATA[Desenvolvedor Java backend e mobile. Entusiasta em tecnologia e filmes, sempre aprendendo novas ferramentas e metodologias. Um profissional dedicado, criativo e]]></description><link>https://blog.paulorabelo.dev.br</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Apr 2026 00:53:53 GMT</lastBuildDate><atom:link href="https://blog.paulorabelo.dev.br/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Getting Started with Google Cloud]]></title><description><![CDATA[In today’s tech landscape, being "in the cloud" is no longer a competitive edge—it is a survival requirement. Google Cloud Platform (GCP) stands out not just as a resource provider, but as the backbone of global innovation.
But how do you start witho...]]></description><link>https://blog.paulorabelo.dev.br/getting-started-with-google-cloud</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/getting-started-with-google-cloud</guid><category><![CDATA[google cloud]]></category><category><![CDATA[GCP]]></category><category><![CDATA[Cloud Engineering ]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Cloud Computing]]></category><category><![CDATA[technology]]></category><category><![CDATA[GoogleCloudSkillsBoost]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Tue, 06 Jan 2026 02:30:54 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767666524643/04ec1336-9f56-4337-aee2-42a51de6006a.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In today’s tech landscape, being "in the cloud" is no longer a competitive edge—it is a survival requirement. <strong>Google Cloud Platform (GCP)</strong> stands out not just as a resource provider, but as the backbone of global innovation.</p>
<p>But how do you start without getting lost in complexity—or costs? This article explores infrastructure fundamentals and the strategic path to becoming a skilled Cloud Engineer.</p>
<h3 id="heading-1-what-is-gcp-and-why-does-it-matter">1. What is GCP and why does it matter?</h3>
<p>GCP is a suite of public cloud services sharing the same global infrastructure Google uses for its billion-user products, such as <strong>YouTube</strong> and <strong>Search</strong>.</p>
<p>For developers, it offers low-latency networking and military-grade security. The best part for beginners is the entry options to learn without immediate costs:</p>
<ul>
<li><p><strong>Free Credits:</strong> Google typically offers a starting credit (often $300) for new users to explore any service.</p>
</li>
<li><p><strong>Student Programs:</strong> Through <em>Google Cloud Skills Boost</em>, students can often access labs and credits via partner institutions.</p>
</li>
<li><p><strong>Free Tier:</strong> Certain resources, like specific Compute Engine instances, are "free tier" (free within monthly usage limits).</p>
</li>
</ul>
<blockquote>
<p><strong>⚠️ Pro Tip:</strong> Free Tier terms and credit amounts can change without notice. <strong>Always set up Budget Alerts</strong> in the GCP Billing console. The cloud is elastic—if you misconfigure a service, it will scale, and so will your credit card bill.</p>
</blockquote>
<h3 id="heading-2-the-pillars-of-cloud-engineering-layer-4-vs-layer-7-osi-model">2. The Pillars of Cloud Engineering: Layer 4 vs. Layer 7 (OSI Model)</h3>
<p>A cloud engineer must master network traffic. When we talk about "Layers," we are referring to the <strong>OSI Model (Open Systems Interconnection)</strong>, a global standard that divides network communication into 7 levels. In GCP, understanding the top layers is vital:</p>
<ul>
<li><p><strong>Layer 4 (Transport):</strong> Focuses on raw speed. The L4 load balancer routes packets based on network data like IP addresses and ports (TCP/UDP). It is ideal for applications where performance is critical and inspecting the message content isn't necessary.</p>
</li>
<li><p><strong>Layer 7 (Application):</strong> The "brain" of the network. It understands the content of the message (HTTP/S), such as URLs, cookies, and headers. This allows for "content-based routing"—directing <code>/video</code> traffic to one group of servers and <code>/payments</code> to another, optimizing both cost and user experience.</p>
</li>
</ul>
<h3 id="heading-3-becoming-an-elite-cloud-engineer">3. Becoming an Elite Cloud Engineer</h3>
<p>The barrier to entry is lowering, but the demand for quality is rising. To stand out:</p>
<ul>
<li><p><strong>Hands-on Experience:</strong> Don't just follow manuals. Understand the logic behind automation scripts, such as using <code>$(hostname)</code> variables to identify instances in real-time.</p>
</li>
<li><p><strong>Certifications:</strong> The <strong>Associate Cloud Engineer (ACE)</strong> exam is the gold standard for beginners, proving you can handle the console, IAM permissions, and the <code>gcloud</code> CLI.</p>
</li>
<li><p><strong>Architectural Resilience:</strong> Learn about <strong>MIGs (Managed Instance Groups)</strong>. The cloud's true power lies in <strong>Self-healing</strong> and <strong>Auto-scaling</strong> systems—infrastructure that fixes itself and grows on demand.</p>
</li>
</ul>
<h3 id="heading-conclusion">Conclusion</h3>
<p>Mastering GCP is a journey of continuous practice. Before launching your first major project, explore the credits and Free Tier, but keep a close eye on your billing dashboard. Automation and network intelligence (OSI Model) are your tools; financial responsibility is what keeps your project viable.</p>
]]></content:encoded></item><item><title><![CDATA[Primeiros Passos no Google Cloud]]></title><description><![CDATA[No cenário tecnológico atual, "estar na nuvem" deixou de ser um diferencial competitivo para se tornar um requisito de sobrevivência. O Google Cloud Platform (GCP) destaca-se não apenas como um fornecedor de recursos, mas como a espinha dorsal de ino...]]></description><link>https://blog.paulorabelo.dev.br/primeiros-passos-no-google-cloud</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/primeiros-passos-no-google-cloud</guid><category><![CDATA[GoogleCloudSkillsBoost]]></category><category><![CDATA[google cloud]]></category><category><![CDATA[GCP]]></category><category><![CDATA[Cloud Engineering ]]></category><category><![CDATA[Devops]]></category><category><![CDATA[CloudComputing]]></category><category><![CDATA[technology]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Tue, 06 Jan 2026 02:27:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767666173944/d9768e00-49fb-4169-980a-667c6c333dcb.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>No cenário tecnológico atual, "estar na nuvem" deixou de ser um diferencial competitivo para se tornar um requisito de sobrevivência. O <strong>Google Cloud Platform (GCP)</strong> destaca-se não apenas como um fornecedor de recursos, mas como a espinha dorsal de inovações globais.</p>
<p>Mas como começar sem se perder na complexidade — ou nos custos? Neste artigo, exploramos os fundamentos da infraestrutura e o caminho para se tornar um engenheiro qualificado.</p>
<h3 id="heading-1-o-que-e-o-gcp-e-por-que-ele-e-relevante">1. O que é o GCP e por que ele é relevante?</h3>
<p>O GCP é um ecossistema de serviços de nuvem pública que compartilha a mesma infraestrutura global usada pelo Google para sustentar o YouTube e o seu motor de busca.</p>
<p>Para empresas e desenvolvedores, isso significa acesso a uma rede de baixa latência e segurança de ponta. No entanto, o grande atrativo para quem está começando são as opções de entrada:</p>
<ul>
<li><p><strong>Créditos para Novos Usuários:</strong> O Google costuma oferecer um crédito inicial (geralmente $300) para novos cadastros testarem qualquer serviço.</p>
</li>
<li><p><strong>Programa Estudantil:</strong> Através do <em>Google Cloud Skills Boost</em>, estudantes de instituições parceiras podem obter créditos e acesso a laboratórios práticos.</p>
</li>
<li><p><strong>Free Tier (Nível Gratuito):</strong> Existem recursos (como instâncias de máquinas virtuais específicas) que são gratuitos "para sempre", dentro de limites mensais de uso.</p>
</li>
</ul>
<blockquote>
<p><strong>⚠️ Atenção:</strong> Os termos do Free Tier e créditos podem mudar. <strong>Sempre configure um Alerta de Orçamento (Budget Alert).</strong> A nuvem é elástica: se algo for configurado errado, ela vai escalar — e a cobrança no seu cartão também.</p>
</blockquote>
<h3 id="heading-2-os-pilares-da-engenharia-de-cloud-camadas-4-vs-7-modelo-osi">2. Os Pilares da Engenharia de Cloud: Camadas 4 vs. 7 (Modelo OSI)</h3>
<p>Um engenheiro de nuvem precisa dominar o tráfego de rede. Quando falamos em "Camadas", estamos nos referindo ao <strong>Modelo OSI (Open Systems Interconnection)</strong>, um padrão mundial que divide a comunicação de rede em 7 níveis. No GCP, entender as camadas superiores é vital:</p>
<ul>
<li><p><strong>Camada 4 (Transporte):</strong> Foca na velocidade bruta. O balanceador L4 roteia pacotes com base em IPs e portas (TCP/UDP). É ideal para aplicações onde a performance é crítica e não é necessário "olhar" o que está dentro do pacote.</p>
</li>
<li><p><strong>Camada 7 (Aplicação):</strong> É o "cérebro" da rede. Ele entende o conteúdo da mensagem (HTTP/S), como URLs, cookies e cabeçalhos. Isso permite direcionar o tráfego de <code>/video</code> para um grupo de servidores e <code>/pagamentos</code> para outro, otimizando custos e experiência do usuário.</p>
</li>
</ul>
<h3 id="heading-3-como-se-tornar-um-engenheiro-de-cloud-de-elite">3. Como se tornar um Engenheiro de Cloud de elite?</h3>
<p>A exigência por qualidade subiu. Para se preparar de forma sólida:</p>
<ul>
<li><p><strong>Mão na massa (Hands-on):</strong> Não apenas siga tutoriais. Entenda a lógica, como o uso de variáveis <code>$(hostname)</code> em scripts de automação para identificar instâncias em tempo real.</p>
</li>
<li><p><strong>Certificações:</strong> O exame <strong>Associate Cloud Engineer</strong> é o ponto de partida ideal. Ele valida se você sabe operar tanto o Console quanto a linha de comando (<code>gcloud</code>).</p>
</li>
<li><p><strong>Resiliência com MIGs:</strong> Aprenda sobre <em>Managed Instance Groups</em>. O poder da nuvem reside no <strong>Self-healing</strong> (auto-recuperação) e <strong>Auto-scaling</strong> (crescimento automático).</p>
</li>
</ul>
<h3 id="heading-conclusao">Conclusão</h3>
<p>Dominar o GCP é uma jornada de prática contínua. Antes de subir seu primeiro projeto, explore os créditos e o <em>Free Tier</em>, mas mantenha sempre um olho no painel de faturamento. A automação e a inteligência de rede (Modelo OSI) são as ferramentas; a responsabilidade financeira é o que mantém o projeto viável.</p>
]]></content:encoded></item><item><title><![CDATA["Olá Mundo" no WhatsApp]]></title><description><![CDATA[Foram 3 semanas de configuração. Passamos por chaves SSH, comandos Linux, Swap de memória, Túneis Cloudflare e arquivos Docker. Tudo para chegar neste momento: ver a mensagem chegar no celular.
Hoje, encerro essa série mostrando como conectei o céreb...]]></description><link>https://blog.paulorabelo.dev.br/ola-mundo-no-whatsapp</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/ola-mundo-no-whatsapp</guid><category><![CDATA[Case Study]]></category><category><![CDATA[n8n]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Cloud]]></category><category><![CDATA[automation]]></category><category><![CDATA[success story]]></category><category><![CDATA[Merry Christmas]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Thu, 25 Dec 2025 02:15:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766085431138/49137194-0945-4ab7-8d4e-4cf2534ee2b5.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Foram 3 semanas de configuração. Passamos por chaves SSH, comandos Linux, Swap de memória, Túneis Cloudflare e arquivos Docker. Tudo para chegar neste momento: ver a mensagem chegar no celular.</p>
<p>Hoje, encerro essa série mostrando como conectei o cérebro (n8n) ao músculo (Evolution API).</p>
<p><strong>1. A Conexão via API Key</strong></p>
<p>Para o n8n mandar mensagens, ele precisa de autorização. No nosso arquivo de configuração, definimos uma <code>Global API Key</code>. No n8n, usamos o nó "HTTP Request". É simples:</p>
<ul>
<li><p><strong>Método:</strong> POST</p>
</li>
<li><p><strong>URL:</strong> <a target="_blank" href="https://api.meudominio.com.br/message/sendText"><code>https://api.meudominio.com.br/message/sendText</code></a></p>
</li>
<li><p><strong>Header:</strong> <code>apikey: minha-senha-secreta</code></p>
</li>
</ul>
<p><strong>2. O Teste de Fogo</strong></p>
<p>Criei um fluxo simples: Um Webhook que recebe dados -&gt; Um nó que formata o texto -&gt; O pedido para a API. Ao clicar em "Execute", a mágica aconteceu. O servidor na Oracle (que não me custou nada) processou o dado, falou com o container do WhatsApp e a notificação apitou no meu bolso. Sem atraso.</p>
<p><strong>3. Valeu a pena?</strong></p>
<p>Vamos aos números finais:</p>
<ul>
<li><p><strong>Custo de Hardware:</strong> R$ 0,00 (Oracle Always Free).</p>
</li>
<li><p><strong>Custo de Licença:</strong> R$ 0,00 (Open Source).</p>
</li>
<li><p><strong>Custo de Domínio:</strong> R$ 40,00/ano (A única coisa que paguei).</p>
</li>
<li><p><strong>Economia estimada:</strong> R$ 200,00 a R$ 300,00 por mês comparado a soluções SaaS ou VPS pagas.</p>
</li>
</ul>
<p>Mas o maior ganho não foi financeiro. Foi o <strong>conhecimento</strong>. Agora tenho controle total dos meus dados, da minha segurança e da minha infraestrutura.</p>
<p>Obrigado a quem acompanhou essa saga! Em 2026 tem muito mais. Feliz Natal!</p>
]]></content:encoded></item><item><title><![CDATA["Hello World" on WhatsApp]]></title><description><![CDATA[It's been 3 weeks of configuration. We went through SSH keys, Linux commands, memory Swap, Cloudflare Tunnels, and Docker files. All to arrive at this moment: seeing the message pop up on the phone.
Today, I wrap up this series by showing how I conne...]]></description><link>https://blog.paulorabelo.dev.br/hello-world-on-whatsapp</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/hello-world-on-whatsapp</guid><category><![CDATA[Case Study]]></category><category><![CDATA[n8n]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Cloud]]></category><category><![CDATA[automation]]></category><category><![CDATA[success story]]></category><category><![CDATA[merrychristmas]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Thu, 25 Dec 2025 02:15:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766084386274/fd50b20e-2a00-4fb4-9b6a-7a371c4e55f6.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It's been 3 weeks of configuration. We went through SSH keys, Linux commands, memory Swap, Cloudflare Tunnels, and Docker files. All to arrive at this moment: seeing the message pop up on the phone.</p>
<p>Today, I wrap up this series by showing how I connected the brain (n8n) to the muscle (Evolution API).</p>
<p><strong>1. The API Key Connection</strong></p>
<p>For n8n to send messages, it needs authorization. In our configuration file, we defined a <code>Global API Key</code>. In n8n, we use the "HTTP Request" node. It's simple:</p>
<ul>
<li><p><strong>Method:</strong> POST</p>
</li>
<li><p><strong>URL:</strong> <a target="_blank" href="https://api.mydomain.com/message/sendText"><code>https://api.mydomain.com/message/sendText</code></a></p>
</li>
<li><p><strong>Header:</strong> <code>apikey: my-secret-password</code></p>
</li>
</ul>
<p><strong>2. The Fire Test</strong></p>
<p>I created a simple flow: A Webhook that receives data -&gt; A node that formats the text -&gt; The request to the API. Clicking "Execute", the magic happened. The Oracle server (which cost me nothing) processed the data, talked to the WhatsApp container, and the notification buzzed in my pocket. Zero delay.</p>
<p><strong>3. Was it worth it?</strong></p>
<p>Let's look at the final numbers:</p>
<ul>
<li><p><strong>Hardware Cost:</strong> $0.00 (Oracle Always Free).</p>
</li>
<li><p><strong>License Cost:</strong> $0.00 (Open Source).</p>
</li>
<li><p><strong>Domain Cost:</strong> ~$10.00/year (The only thing I paid for).</p>
</li>
<li><p><strong>Estimated Savings:</strong> $40.00 to $60.00 per month compared to SaaS or paid VPS solutions.</p>
</li>
</ul>
<p>But the biggest gain wasn't financial. It was <strong>knowledge</strong>. I now have total control over my data, my security, and my infrastructure.</p>
<p>Thanks to everyone who followed this saga! Much more to come in 2026. Merry Christmas!</p>
]]></content:encoded></item><item><title><![CDATA[O Grande Combo]]></title><description><![CDATA[Chegamos ao momento da verdade. Temos um servidor Oracle (gratuito), temos memória Swap (para não travar) e temos um Túnel seguro. Agora, vamos instalar os softwares que vão realmente trabalhar para nós.
Se fôssemos instalar o n8n e a Evolution API d...]]></description><link>https://blog.paulorabelo.dev.br/o-grande-combo</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/o-grande-combo</guid><category><![CDATA[Docker]]></category><category><![CDATA[Docker compose]]></category><category><![CDATA[n8n]]></category><category><![CDATA[evolutionapi]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Cloud]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Tue, 23 Dec 2025 02:59:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766079450398/cbe8e548-ced7-4a23-86cf-f10e6c8b0629.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Chegamos ao momento da verdade. Temos um servidor Oracle (gratuito), temos memória Swap (para não travar) e temos um Túnel seguro. Agora, vamos instalar os softwares que vão realmente trabalhar para nós.</p>
<p>Se fôssemos instalar o <a target="_blank" href="https://n8n.io/"><strong>n8n</strong></a> e a <a target="_blank" href="https://doc.evolution-api.com/v2/pt/get-started/introduction"><strong>Evolution API</strong></a> do jeito "antigo", teríamos que baixar arquivos, instalar dependências do Node.js, configurar banco de dados na mão... um pesadelo.</p>
<p>Mas como estamos usando <a target="_blank" href="https://www.docker.com/"><strong>Docker</strong></a>, vamos usar a estratégia do "Combo" com o <strong>Docker Compose</strong>.</p>
<p><strong>1. A Receita do Bolo (O Arquivo Mágico)</strong></p>
<p>O Docker Compose permite escrever uma "receita" num arquivo de texto. Nós dizemos: "Quero um banco <a target="_blank" href="https://www.postgresql.org/">Postgres</a>, um cache <a target="_blank" href="https://redis.io/">Redis</a>, a API do WhatsApp e o n8n. E quero que todos conversem entre si."</p>
<p>Acesse a pasta do seu projeto (<code>cd ~/n8n</code>) e edite o arquivo (<code>nano docker-compose.yml</code>). Apague o que tiver lá e cole esta <strong>Stack Completa</strong>:</p>
<p>YAML</p>
<pre><code class="lang-bash">services:
  <span class="hljs-comment"># 1. Banco de Dados (Postgres para Evolution)</span>
  postgres:
    image: postgres:15-alpine
    restart: always
    environment:
      POSTGRES_USER: evolution
      POSTGRES_PASSWORD: evolution_password
      POSTGRES_DB: evolution
    volumes:
      - evolution_db:/var/lib/postgresql/data
    healthcheck:
      <span class="hljs-built_in">test</span>: [<span class="hljs-string">"CMD-SHELL"</span>, <span class="hljs-string">"pg_isready -U evolution"</span>]
      interval: 5s
      timeout: 5s
      retries: 5

  <span class="hljs-comment"># 2. Cache (Redis para Evolution)</span>
  redis:
    image: redis:alpine
    restart: always
    <span class="hljs-built_in">command</span>: [<span class="hljs-string">"redis-server"</span>, <span class="hljs-string">"--appendonly"</span>, <span class="hljs-string">"no"</span>]

  <span class="hljs-comment"># 3. Evolution API v2 (O WhatsApp)</span>
  evolution:
    image: atendai/evolution-api:v2.2.2
    restart: always
    ports:
      - <span class="hljs-string">"8080:8080"</span>
    environment:
      - SERVER_URL=https://api.SEUDOMINIO.com.br
      - AUTHENTICATION_API_KEY=[SUA-CHAVE-APY-VAI-AQUI]
      - DATABASE_ENABLED=<span class="hljs-literal">true</span>
      - DATABASE_PROVIDER=postgresql
      - DATABASE_CONNECTION_URI=postgresql://evolution:evolution_password@postgres:5432/evolution
      - CACHE_REDIS_ENABLED=<span class="hljs-literal">true</span>
      - CACHE_REDIS_URI=redis://redis:6379/0
      - DEL_INSTANCE=<span class="hljs-literal">false</span>
      <span class="hljs-comment"># Truque para evitar desconexão do WhatsApp Web</span>
      - CONFIG_SESSION_PHONE_VERSION=2.3000.1019430043
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_started

  <span class="hljs-comment"># 4. n8n (A Automação)</span>
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    restart: always
    ports:
      - <span class="hljs-string">"5678:5678"</span>
    environment:
      - N8N_HOST=n8n.SEUDOMINIO.com.br
      - WEBHOOK_URL=https://n8n.SEUDOMINIO.com.br/
      - GENERIC_TIMEZONE=America/Sao_Paulo
      - TZ=America/Sao_Paulo
      - N8N_SECURE_COOKIE=<span class="hljs-literal">false</span>
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:
  evolution_db:
</code></pre>
<p><strong>2. O Segredo da Integração (Networking)</strong></p>
<p>A mágica acontece na rede interna do Docker. Quando você for conectar o n8n na Evolution API, <strong>não use</strong> o endereço externo (<a target="_blank" href="https://api"><code>https://api</code></a><code>...</code>). Use o endereço interno da rede Docker:</p>
<p>👉 <strong>URL:</strong> <a target="_blank" href="http://evolution:8080"><code>http://evolution:8080</code></a></p>
<p>Isso faz com que o n8n converse diretamente com o container do WhatsApp via cabo de rede virtual, sem sair para a internet. É mais seguro, instantâneo e não passa pelo firewall.</p>
<p><strong>3. O Comando de Lançamento</strong></p>
<p>Depois de salvar o arquivo (<code>Ctrl+O</code>, <code>Ctrl+X</code>), a mágica acontece com apenas três palavras no terminal:</p>
<p>Bash</p>
<pre><code class="lang-bash">docker compose up -d
</code></pre>
<p>O servidor vai baixar as imagens, criar os bancos de dados e conectar tudo. Em cerca de 2 minutos, você terá uma infraestrutura de nível empresarial rodando na sua máquina gratuita.</p>
<p>Na quinta-feira, vamos para o teste final: fazer o primeiro envio de mensagem!</p>
]]></content:encoded></item><item><title><![CDATA[The Big Combo]]></title><description><![CDATA[We've reached the moment of truth. We have an Oracle server (free), Swap memory (to prevent crashing), and a secure Tunnel. Now, let's install the software that will actually work for us.
If we were to install n8n and Evolution API the "old way," we'...]]></description><link>https://blog.paulorabelo.dev.br/the-big-combo</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/the-big-combo</guid><category><![CDATA[Docker compose]]></category><category><![CDATA[n8n]]></category><category><![CDATA[evolutionapi]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Oracle Cloud]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Tue, 23 Dec 2025 02:59:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766070393444/86d9e5df-7bf5-4af5-beae-cda11f5f83ef.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We've reached the moment of truth. We have an Oracle server (free), Swap memory (to prevent crashing), and a secure Tunnel. Now, let's install the software that will actually work for us.</p>
<p>If we were to install <a target="_blank" href="https://n8n.io/"><strong>n8n</strong></a> and <a target="_blank" href="https://doc.evolution-api.com/v2/en/get-started/introduction"><strong>Evolution API</strong></a> the "old way," we'd have to download files, install Node.js dependencies, configure databases manually... a nightmare.</p>
<p>But since we are using <strong>Docker</strong>, we'll use the "Combo" strategy with <strong>Docker Compose</strong>.</p>
<p><strong>1. The Recipe (The Magic File)</strong></p>
<p>Docker Compose allows us to write a "recipe" in a text file. We say: "I want a Postgres database, a Redis cache, the WhatsApp API, and n8n. And I want them all to talk to each other."</p>
<p>Go to your project folder (<code>cd ~/n8n</code>) and edit the file (<code>nano docker-compose.yml</code>). Delete whatever is inside and paste this <strong>Full Stack</strong>:</p>
<p>YAML</p>
<pre><code class="lang-bash">services:
  <span class="hljs-comment"># 1. Database (Postgres for Evolution)</span>
  postgres:
    image: postgres:15-alpine
    restart: always
    environment:
      POSTGRES_USER: evolution
      POSTGRES_PASSWORD: evolution_password
      POSTGRES_DB: evolution
    volumes:
      - evolution_db:/var/lib/postgresql/data
    healthcheck:
      <span class="hljs-built_in">test</span>: [<span class="hljs-string">"CMD-SHELL"</span>, <span class="hljs-string">"pg_isready -U evolution"</span>]
      interval: 5s
      timeout: 5s
      retries: 5

  <span class="hljs-comment"># 2. Cache (Redis for Evolution)</span>
  redis:
    image: redis:alpine
    restart: always
    <span class="hljs-built_in">command</span>: [<span class="hljs-string">"redis-server"</span>, <span class="hljs-string">"--appendonly"</span>, <span class="hljs-string">"no"</span>]

  <span class="hljs-comment"># 3. Evolution API v2 (WhatsApp)</span>
  evolution:
    image: atendai/evolution-api:v2.2.2
    restart: always
    ports:
      - <span class="hljs-string">"8080:8080"</span>
    environment:
      - SERVER_URL=https://api.YOURDOMAIN.com
      - AUTHENTICATION_API_KEY=[YOUR-AUTHENTICATION-KEY-GOES-HERE]
      - DATABASE_ENABLED=<span class="hljs-literal">true</span>
      - DATABASE_PROVIDER=postgresql
      - DATABASE_CONNECTION_URI=postgresql://evolution:evolution_password@postgres:5432/evolution
      - CACHE_REDIS_ENABLED=<span class="hljs-literal">true</span>
      - CACHE_REDIS_URI=redis://redis:6379/0
      - DEL_INSTANCE=<span class="hljs-literal">false</span>
      <span class="hljs-comment"># Trick to prevent WhatsApp Web disconnection</span>
      - CONFIG_SESSION_PHONE_VERSION=2.3000.1019430043
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_started

  <span class="hljs-comment"># 4. n8n (Automation)</span>
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    restart: always
    ports:
      - <span class="hljs-string">"5678:5678"</span>
    environment:
      - N8N_HOST=n8n.YOURDOMAIN.com
      - WEBHOOK_URL=https://n8n.YOURDOMAIN.com/
      - GENERIC_TIMEZONE=America/Sao_Paulo
      - TZ=America/Sao_Paulo
      - N8N_SECURE_COOKIE=<span class="hljs-literal">false</span>
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:
  evolution_db:
</code></pre>
<p><strong>2. The Integration Secret (Networking)</strong></p>
<p>The magic happens in Docker's internal network. When connecting n8n to the Evolution API, <strong>do not use</strong> the external address (<a target="_blank" href="https://api"><code>https://api</code></a><code>...</code>). Use the internal Docker network address:</p>
<p>👉 <strong>URL:</strong> <a target="_blank" href="http://evolution:8080"><code>http://evolution:8080</code></a></p>
<p>This allows n8n to talk directly to the WhatsApp container via a virtual network cable, without going out to the internet. It is safer, instant, and bypasses the firewall.</p>
<p><strong>3. The Launch Command</strong></p>
<p>After saving the file (<code>Ctrl+O</code>, <code>Ctrl+X</code>), the magic happens with just three words in the terminal:</p>
<p>Bash</p>
<pre><code class="lang-bash">docker compose up -d
</code></pre>
<p>The server will download the images, create the databases, and connect everything. In about 2 minutes, you will have enterprise-grade infrastructure running on your free machine.</p>
<p>On Thursday, we go for the final test: sending the first message!</p>
]]></content:encoded></item><item><title><![CDATA[Adeus Portas Abertas]]></title><description><![CDATA[Antigamente, para colocar um servidor na internet, você precisava:

Abrir portas no firewall (80, 443, 8080).

Configurar redirecionamento no roteador (NAT).

Expor o IP real do seu servidor para o mundo.

Sofrer configurando certificados SSL (aquele...]]></description><link>https://blog.paulorabelo.dev.br/adeus-portas-abertas</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/adeus-portas-abertas</guid><category><![CDATA[cybersecurity]]></category><category><![CDATA[cloudflare]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Oracle Cloud]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[self-hosted]]></category><category><![CDATA[networking]]></category><category><![CDATA[https]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Thu, 18 Dec 2025 02:36:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766024959516/92ac0f15-dbc7-47ec-bd29-b0dd497fd428.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Antigamente, para colocar um servidor na internet, você precisava:</p>
<ol>
<li><p>Abrir portas no firewall (80, 443, 8080).</p>
</li>
<li><p>Configurar redirecionamento no roteador (NAT).</p>
</li>
<li><p>Expor o IP real do seu servidor para o mundo.</p>
</li>
<li><p>Sofrer configurando certificados SSL (aquele cadeado verde) que expiravam a cada 3 meses.</p>
</li>
</ol>
<p>Esqueça isso. Existe um jeito muito melhor, mais seguro e gratuito: <a target="_blank" href="https://www.cloudflare.com/pt-br/"><strong>Cloudflare</strong></a> <strong>Tunnel</strong>.</p>
<p>Hoje, vou mostrar como conectei meu servidor Oracle ao mundo sem abrir <strong>nenhuma</strong> porta de entrada.</p>
<p><strong>1. O Conceito de Túnel</strong></p>
<p>Imagine que, em vez de abrir a porta da frente da sua casa para receber visitas, você cavasse um túnel subterrâneo secreto que sai direto dentro da sala segura do Cloudflare. É isso que o <code>cloudflared</code> faz. Ele cria uma conexão de <em>saída</em> criptografada. Ninguém na internet consegue "bater" no meu servidor, porque não há portas abertas.</p>
<p><strong>2. Configuração via Arquivo (YAML)</strong></p>
<p>Para manter o controle total, configurei o túnel usando um arquivo <code>config.yml</code> dentro do servidor. A mágica acontece no roteamento:</p>
<p>YAML</p>
<pre><code class="lang-bash">ingress:
  - hostname: n8n.meudominio.com.br
    service: http://localhost:5678
  - hostname: api.meudominio.com.br
    service: http://localhost:8080
</code></pre>
<p>Veja que incrível: o Cloudflare recebe o acesso no subdomínio <code>n8n</code> e entrega direto na porta <code>5678</code> interna do meu Docker. O mundo vê HTTPS seguro, mas meu servidor nem sabe o que é SSL.</p>
<p><strong>3. Webhook Seguro</strong></p>
<p>Também configurei uma rota para <a target="_blank" href="http://webhook.meudominio.com.br"><code>webhook.meudominio.com.br</code></a>. Isso permite que sistemas externos enviem dados para minhas automações com total segurança e velocidade.</p>
<p><strong>Conclusão da Semana 2</strong> Temos a máquina, temos o Docker, temos memória sobrando (Swap) e temos uma conexão blindada. O palco está montado. Na próxima semana, começa o show: vamos instalar e integrar o <a target="_blank" href="https://n8n.io/"><strong>n8n</strong></a> e a <a target="_blank" href="https://doc.evolution-api.com/v2/pt/get-started/introduction"><strong>Evolution API</strong></a>.</p>
]]></content:encoded></item><item><title><![CDATA[Goodbye Open Ports]]></title><description><![CDATA[In the old days, to put a server on the internet, you needed to:

Open firewall ports (80, 443, 8080).

Configure router forwarding (NAT).

Expose your server's real IP to the world.

Suffer configuring SSL certificates (that green padlock) that expi...]]></description><link>https://blog.paulorabelo.dev.br/goodbye-open-ports</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/goodbye-open-ports</guid><category><![CDATA[cybersecurity]]></category><category><![CDATA[cloudflare]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Oracle Cloud]]></category><category><![CDATA[SelfHosting]]></category><category><![CDATA[networking]]></category><category><![CDATA[https]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Thu, 18 Dec 2025 02:28:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766024741875/c38f687d-a4ff-42e7-84a7-07d860793f86.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the old days, to put a server on the internet, you needed to:</p>
<ol>
<li><p>Open firewall ports (80, 443, 8080).</p>
</li>
<li><p>Configure router forwarding (NAT).</p>
</li>
<li><p>Expose your server's real IP to the world.</p>
</li>
<li><p>Suffer configuring SSL certificates (that green padlock) that expired every 3 months.</p>
</li>
</ol>
<p>Forget that. There is a much better, safer, and free way: <strong>Cloudflare Tunnel</strong>.</p>
<p>Today, I'll show you how I connected my Oracle server to the world without opening <strong>any</strong> entry ports.</p>
<p><strong>1. The Tunnel Concept</strong></p>
<p>Imagine that instead of opening your front door to receive visitors, you dug a secret underground tunnel that leads straight into Cloudflare's secure room. That's what <code>cloudflared</code> does. It creates an encrypted <em>outbound</em> connection. No one on the internet can "knock" on my server because there are no open ports.</p>
<p><strong>2. Configuration via File (YAML)</strong></p>
<p>To maintain total control, I configured the tunnel using a <code>config.yml</code> file inside the server. The magic happens in the routing:</p>
<p>YAML</p>
<pre><code class="lang-bash">ingress:
  - hostname: n8n.mydomain.com
    service: http://localhost:5678
  - hostname: api.mydomain.com
    service: http://localhost:8080
</code></pre>
<p>Look how amazing this is: Cloudflare receives access on the <code>n8n</code> subdomain and delivers it straight to the internal port <code>5678</code> of my Docker. The world sees secure HTTPS, but my server doesn't even know what SSL is.</p>
<p><strong>3. Secure Webhook</strong></p>
<p>I also configured a route for <a target="_blank" href="http://webhook.mydomain.com"><code>webhook.mydomain.com</code></a>. This allows external systems to send data to my automations with total security and speed.</p>
<p><strong>Week 2 Conclusion</strong> We have the machine, we have Docker, we have spare memory (Swap), and we have an armored connection. The stage is set. Next week, the show begins: we will install and integrate <strong>n8n</strong> and <strong>Evolution API</strong>.</p>
]]></content:encoded></item><item><title><![CDATA[The Server Engine]]></title><description><![CDATA[If you followed our saga last week, you already have an Oracle Cloud instance created and SSH access working. But for now, it's just an empty box. Today, we are going to install the heart of our infrastructure: Docker.
And we have an extra challenge:...]]></description><link>https://blog.paulorabelo.dev.br/the-server-engine</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/the-server-engine</guid><category><![CDATA[Docker]]></category><category><![CDATA[Linux]]></category><category><![CDATA[swap]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Devops]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[low cost]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Tue, 16 Dec 2025 01:32:18 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765848337517/db511f30-86ee-4218-a376-d97ff5ef0132.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you followed our saga last week, you already have an Oracle Cloud instance created and SSH access working. But for now, it's just an empty box. Today, we are going to install the heart of our infrastructure: <strong>Docker</strong>.</p>
<p>And we have an extra challenge: since we are using the <strong>AMD Micro</strong> instance (free tier), we only have <strong>1GB of RAM</strong>. If we try to run n8n and a WhatsApp API here, the server will crash in 5 minutes.</p>
<p>I'll show you how I solved this using an old SysAdmin trick: <strong>Swap</strong>.</p>
<p><strong>1. The "Root" Docker Installation</strong></p>
<p>We could use fancy panels, but they consume memory. On small machines, every megabyte counts. That's why I did the installation via the terminal, which is clean and efficient:</p>
<p>Bash</p>
<pre><code class="lang-bash">curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
</code></pre>
<p>Simple as that. With this, we have the most powerful container engine in the world ready to run.</p>
<p><strong>2. The 1GB RAM Problem</strong></p>
<p>Modern applications like <a target="_blank" href="https://doc.evolution-api.com/v2/en/get-started/introduction"><strong>Evolution API</strong></a> (for WhatsApp) use browsers behind the scenes. They "eat" memory. With only 1GB of physical RAM, Linux triggers the <em>OOM Killer</em> (Out of Memory Killer) and shuts down your programs out of nowhere.</p>
<p>The solution? Create <strong>Virtual Memory (Swap)</strong> using hard drive space.</p>
<p><strong>3. Creating 4GB of "Extra Memory"</strong></p>
<p>Since Oracle gives us 50GB of disk space, I decided to allocate <strong>4GB</strong> for Swap. This works like a "lung": when RAM fills up, the server uses the disk so it doesn't freeze.</p>
<p>The process involves creating a file, setting security permissions, and telling Linux to use it:</p>
<p>Bash</p>
<pre><code class="lang-bash">sudo fallocate -l 4G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
</code></pre>
<p>I also adjusted <em>Swappiness</em> to 10, ensuring the system prioritizes fast RAM and only uses the disk in emergencies.</p>
<p><strong>Result:</strong> We now have a server "armored" against memory shortages, ready to host <a target="_blank" href="https://n8n.io/">n8n</a> and Evolution API without fear of crashes.</p>
<p>On Thursday, I will reveal how I access all of this externally without opening a single security port on the firewall.</p>
]]></content:encoded></item><item><title><![CDATA[O Motor do Servidor]]></title><description><![CDATA[Se você acompanhou a nossa saga na semana passada, já tem uma instância Oracle Cloud criada e acesso SSH funcionando. Mas, por enquanto, ela é apenas uma caixa vazia. Hoje, vamos instalar o coração da nossa infraestrutura: o Docker.
E temos um desafi...]]></description><link>https://blog.paulorabelo.dev.br/o-motor-do-servidor</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/o-motor-do-servidor</guid><category><![CDATA[lowcost]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Linux]]></category><category><![CDATA[swap]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[Devops]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[Devops articles]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Tue, 16 Dec 2025 01:24:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765848085309/c1c9589c-90d2-4881-9b2d-cea4d1160783.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Se você acompanhou a nossa saga na semana passada, já tem uma instância <a target="_blank" href="https://www.oracle.com/br/cloud/">Oracle Cloud</a> criada e acesso SSH funcionando. Mas, por enquanto, ela é apenas uma caixa vazia. Hoje, vamos instalar o coração da nossa infraestrutura: o Docker.</p>
<p>E temos um desafio extra: como estamos usando a instância <strong>AMD Micro</strong> (gratuita), temos apenas <strong>1GB de memória RAM</strong>. Se tentarmos rodar o n8n e uma API de WhatsApp aqui, o servidor vai travar em 5 minutos.</p>
<p>Vou mostrar como resolvi isso usando um truque antigo de SysAdmin: o <strong>Swap</strong>.</p>
<p><strong>1. A Instalação "Raiz" do</strong> <strong>Docker</strong></p>
<p>Poderíamos usar painéis bonitos, mas eles consomem memória. Em máquinas pequenas, cada megabyte conta. Por isso, fiz a instalação via terminal, que é limpa e eficiente:</p>
<p>Bash</p>
<pre><code class="lang-bash">curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
</code></pre>
<p>Simples assim. Com isso, temos o motor de containers mais poderoso do mundo pronto para rodar.</p>
<p><strong>2. O Problema do 1GB de RAM</strong></p>
<p>Aplicações modernas como o <a target="_blank" href="https://doc.evolution-api.com/v1/pt/get-started/introduction"><strong>Evolution API</strong></a> (para WhatsApp) usam navegadores por trás dos panos. Eles "comem" memória. Com apenas 1GB físico, o Linux aciona o <em>OOM Killer</em> (assassino de falta de memória) e fecha seus programas do nada.</p>
<p>A solução? Criar uma <strong>Memória Virtual (Swap)</strong> usando o espaço do disco rígido.</p>
<p><strong>3. Criando 4GB de "Memória Extra"</strong></p>
<p>Como a Oracle nos dá 50GB de disco, decidi alocar <strong>4GB</strong> para Swap. Isso funciona como um "pulmão": quando a memória RAM enche, o servidor usa o disco para não travar.</p>
<p>O processo envolve criar um arquivo, definir permissões de segurança e avisar o Linux para usá-lo:</p>
<p>Bash</p>
<pre><code class="lang-bash">sudo fallocate -l 4G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
</code></pre>
<p>Também ajustei o <em>Swappiness</em> para 10, garantindo que o sistema priorize a RAM rápida e só use o disco em emergências.</p>
<p><strong>Resultado:</strong> Agora temos um servidor "blindado" contra falta de memória, pronto para receber o <a target="_blank" href="https://n8n.io/">n8n</a> e o Evolution API sem medo de travamentos.</p>
<p>Na quinta-feira, vou revelar como acesso tudo isso externamente sem abrir nenhuma porta de segurança no firewall.</p>
]]></content:encoded></item><item><title><![CDATA[A Saga do Servidor]]></title><description><![CDATA[No último artigo, contei por que decidi abandonar a hospedagem compartilhada e montar um servidor próprio na Oracle Cloud (Free Tier). Hoje, vamos para a prática: como criar a máquina e, o mais importante, como entrar nela sem perder a sanidade.
Pare...]]></description><link>https://blog.paulorabelo.dev.br/a-saga-do-servidor-parte-ii</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/a-saga-do-servidor-parte-ii</guid><category><![CDATA[Linux]]></category><category><![CDATA[ssh]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Learning Journey]]></category><category><![CDATA[self-hosted]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Fri, 12 Dec 2025 00:08:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765497760347/add014ee-554d-468a-afa5-7ff7021c34f2.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>No último artigo, contei por que decidi abandonar a hospedagem compartilhada e montar um servidor próprio na Oracle Cloud (Free Tier). Hoje, vamos para a prática: como criar a máquina e, o mais importante, como entrar nela sem perder a sanidade.</p>
<p>Parece simples: "Criar Instância", "Baixar Chave", "Conectar". Mas quem já mexeu com Linux e Cloud sabe que o buraco é mais embaixo.</p>
<p><strong>1. A Escolha da Máquina (O nosso "Fusquinha")</strong></p>
<p>O sonho de consumo na Oracle é a instância <strong>Ampere (ARM)</strong> com 24GB de RAM. Mas, como ela é muito disputada, muitas vezes não tem capacidade disponível. A estratégia? Não ficar parado. Provisionei uma instância <strong>AMD Micro (E2.1)</strong>. Tem apenas 1GB de RAM e 2 CPUs, mas é suficiente para começar.</p>
<ul>
<li><strong>Dica de Ouro:</strong> Escolhi o <strong>Ubuntu 24.04</strong> como sistema operacional. É estável, moderno e tem tutorial para tudo na internet.</li>
</ul>
<p><strong>2. O Desafio das Chaves SSH</strong></p>
<p>Diferente de um cPanel onde você tem um usuário e senha, na Cloud profissional usamos <strong>Chaves SSH</strong>. É um arquivo (<code>.key</code>) que funciona como uma chave física de casa. O problema começa quando você tenta usar essa chave no terminal.</p>
<p>O erro clássico que enfrentei: <code>WARNING: UNPROTECTED PRIVATE KEY FILE!</code></p>
<p>O Linux é paranoico (com razão). Se a sua chave estiver numa pasta onde "outros usuários" do computador podem ler, ele bloqueia o acesso na hora. A solução não é óbvia para quem vem do Windows:</p>
<p>Bash</p>
<pre><code class="lang-bash">chmod 600 minha-chave.key
</code></pre>
<p>Esse comando diz ao sistema: "Apenas eu leio isso. Ninguém mais." Foi o primeiro "estalo" de que agora sou eu quem manda na segurança.</p>
<p><strong>3. Entrando como um Profissional (O Arquivo Config)</strong></p>
<p>Depois de corrigir as permissões, digitar <code>ssh -i caminho/da/chave ubuntu@123.123.123.123</code> toda vez cansa demais. Descobri que podemos criar um "atalho" no arquivo <code>~/.ssh/config</code> do nosso computador:</p>
<p>Plaintext</p>
<pre><code class="lang-bash">Host oracle
    HostName 123.123.123.123
    User ubuntu
    IdentityFile ~/.ssh/minha-chave.key
</code></pre>
<p>Agora, basta digitar <code>ssh oracle</code> no terminal e estou dentro.</p>
<p><strong>4. E o Firewall?</strong></p>
<p>Ao entrar, a primeira coisa que notei: o firewall da Oracle (Security Lists) bloqueia tudo por padrão. Tentar abrir a porta 80 ou 443 exige configurações chatas no painel da Cloud e no <code>iptables</code> da máquina. Mas não vamos sofrer com isso. Na próxima semana, vou mostrar como contornei todo o firewall usando <strong>Túneis Cloudflare</strong>, expondo meus serviços com HTTPS sem abrir um único buraco na segurança do servidor.</p>
<p><strong>Resumo da Semana 1:</strong> Temos um servidor Linux gratuito, atualizado e com acesso SSH configurado e seguro. A fundação está pronta. Na próxima terça-feira, vamos instalar o motor que fará tudo funcionar: o <a target="_blank" href="https://www.docker.com/"><strong>Docker</strong></a>.</p>
]]></content:encoded></item><item><title><![CDATA[The Server Saga]]></title><description><![CDATA[In the last article, I shared why I decided to ditch shared hosting and build my own server on Oracle Cloud (Free Tier). Today, we get practical: how to create the machine and, most importantly, how to get inside without losing your sanity.
It sounds...]]></description><link>https://blog.paulorabelo.dev.br/the-server-saga-part-ii</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/the-server-saga-part-ii</guid><category><![CDATA[Linux]]></category><category><![CDATA[ssh]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Learning Journey]]></category><category><![CDATA[self-hosted]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Thu, 11 Dec 2025 23:54:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765493073113/bb2355f0-95b9-4e18-8c06-2cba92a8f348.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the last article, I shared why I decided to ditch shared hosting and build my own server on Oracle Cloud (Free Tier). Today, we get practical: how to create the machine and, most importantly, how to get inside without losing your sanity.</p>
<p>It sounds simple: "Create Instance", "Download Key", "Connect". But anyone who has dealt with Linux and Cloud knows it's never that straightforward.</p>
<p><strong>1. Choosing the Machine (Our "Little Beetle")</strong></p>
<p>The dream setup on Oracle is the <strong>Ampere (ARM)</strong> instance with 24GB of RAM. However, since it's highly sought after, capacity is often unavailable. The strategy? Don't stand still. I provisioned an <strong>AMD Micro (E2.1)</strong> instance. It only has 1GB of RAM and 2 CPUs, but it's enough to get started.</p>
<ul>
<li><strong>Pro Tip:</strong> I chose <strong>Ubuntu 24.04</strong> as the operating system. It's stable, modern, and has tutorials for everything.</li>
</ul>
<p><strong>2. The SSH Key Challenge</strong></p>
<p>Unlike cPanel where you have a login password, in professional Cloud environments, we use <strong>SSH Keys</strong>. It's a file (<code>.key</code>) that acts like a physical key. The trouble starts when you try to use this key in the terminal.</p>
<p>The classic error I faced: <code>WARNING: UNPROTECTED PRIVATE KEY FILE!</code></p>
<p>Linux is paranoid (rightfully so). If your key is in a folder where "other users" can read it, it blocks access. The solution isn't obvious for Windows users:</p>
<p>Bash</p>
<pre><code class="lang-bash">chmod 600 my-key.key
</code></pre>
<p>This command tells the system: "Only I read this. No one else." It was the first realization that I am now the one in charge of security.</p>
<p><strong>3. Connecting Like a Pro (The Config File)</strong></p>
<p>After fixing permissions, typing <code>ssh -i path/to/key ubuntu@123.123.123.123</code> every time gets tiring. I discovered we can create a "shortcut" in our computer's <code>~/.ssh/config</code> file:</p>
<p>Plaintext</p>
<pre><code class="lang-bash">Host oracle
    HostName 123.123.123.123
    User ubuntu
    IdentityFile ~/.ssh/my-key.key
</code></pre>
<p>Now, I just type <code>ssh oracle</code> in the terminal and I'm in.</p>
<p><strong>4. What About the Firewall?</strong></p>
<p>Upon entering, the first thing I noticed: Oracle's firewall (Security Lists) blocks everything by default. Trying to open port 80 or 443 requires complex configurations in the Cloud panel and the machine's <code>iptables</code>. But we won't suffer through that. Next week, I'll show how I bypassed the entire firewall using <strong>Cloudflare Tunnels</strong>, exposing my services with HTTPS without punching a single hole in the server's security.</p>
<p><strong>Week 1 Summary:</strong> We have a free Linux server, updated, and with SSH access configured and secure. The foundation is laid. Next Tuesday, we will install the engine that will run everything: <strong>Docker</strong>.</p>
]]></content:encoded></item><item><title><![CDATA[From Zero to Own Server]]></title><description><![CDATA[Working with professional automation tools (n8n, Typebot, WhatsApp APIs) requires infrastructure that most shared hosting plans simply cannot deliver. Anyone who has tried running n8n on a standard "cPanel" knows the struggle: slowness, constant cras...]]></description><link>https://blog.paulorabelo.dev.br/from-zero-to-own-server</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/from-zero-to-own-server</guid><category><![CDATA[Devops]]></category><category><![CDATA[n8n]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[automation]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[#TechJourney]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Wed, 10 Dec 2025 02:48:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765334782410/08fff4ce-7bd4-4c0b-9fba-c1ed455ff437.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Working with professional automation tools (n8n, Typebot, WhatsApp APIs) requires infrastructure that most shared hosting plans simply cannot deliver. Anyone who has tried running n8n on a standard "cPanel" knows the struggle: slowness, constant crashes, and memory limits.</p>
<p>The obvious solution would be to rent a robust VPS (Virtual Private Server) on DigitalOcean or AWS. But to get a machine with 4 CPUs and 24GB of RAM, the bill would easily exceed $40 or $50 per month. For those starting out or scaling an operation, this fixed cost adds up.</p>
<p>That's when I decided to accept a challenge: <strong>Build an "Enterprise-level" infrastructure spending exactly $0.00.</strong></p>
<p>Sounds too good to be true? I thought so too. But then I discovered the <em>Oracle Cloud Always Free Tier</em>.</p>
<p><strong>The Dream Setup (For Free)</strong></p>
<p>Unlike other providers that offer "free trials" for 30 days, Oracle offers (if you can snag a spot) an <strong>ARM Ampere</strong> machine with up to <strong>4 OCPUs and 24GB of RAM</strong> forever. Even when that machine is unavailable, we can use AMD Micro instances, which are modest but perfect for validating test environments and running lightweight services via Docker.</p>
<p>In this new technical journey, I migrated my automations there and achieved:</p>
<ul>
<li><p><strong>Pure Docker:</strong> Total control over versions and containers.</p>
</li>
<li><p><strong>Self-hosted n8n:</strong> No execution limits.</p>
</li>
<li><p><strong>Evolution API v2:</strong> Professional WhatsApp integration.</p>
</li>
<li><p><strong>Cloudflare Tunnel:</strong> The icing on the cake. I achieved secure HTTPS and external access without opening a single port on the firewall or exposing the server IP.</p>
</li>
</ul>
<p><strong>It's Not All Roses: The Challenges</strong></p>
<p>I won't lie: it's not "click and install." Leaving the comfort zone of ready-made hosting requires getting your hands dirty in the terminal. We had to deal with SSH keys, Linux file permissions, Swap configuration (virtual memory), and YAML files that don't forgive a single misplaced space.</p>
<p>But the result is worth it. I now have a server that is mine, secure, and extremely performant.</p>
<p><strong>Follow the Series</strong></p>
<p>Over the coming weeks, I will document the technical step-by-step of this implementation here on the blog. If you want to learn how to set up your own automation server with no licensing costs, stay tuned.</p>
<p>Next Thursday, I will explain the first critical step: <strong>How to create the account, generate security keys, and access the server without getting locked out.</strong></p>
<p>See you there!</p>
]]></content:encoded></item><item><title><![CDATA[Do Zero ao Servidor Próprio]]></title><description><![CDATA[Trabalhar com automações profissionais (n8n, Typebot, APIs de WhatsApp) exige uma infraestrutura que a maioria das hospedagens compartilhadas simplesmente não consegue oferecer. Quem já tentou rodar um n8n num "cPanel" da vida sabe o que estou faland...]]></description><link>https://blog.paulorabelo.dev.br/do-zero-ao-servidor-proprio</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/do-zero-ao-servidor-proprio</guid><category><![CDATA[Devops]]></category><category><![CDATA[n8n]]></category><category><![CDATA[Oracle]]></category><category><![CDATA[automation]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[#TechJourney]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Wed, 10 Dec 2025 02:41:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765334297566/3dcd6066-cf18-4ba1-9a28-16a63e308c91.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Trabalhar com automações profissionais (n8n, Typebot, APIs de WhatsApp) exige uma infraestrutura que a maioria das hospedagens compartilhadas simplesmente não consegue oferecer. Quem já tentou rodar um n8n num "cPanel" da vida sabe o que estou falando: lentidão, quedas constantes e limitações de memória.</p>
<p>A solução óbvia seria contratar um VPS (Servidor Privado Virtual) robusto na DigitalOcean ou AWS. Mas para ter uma máquina com 4 CPUs e 24GB de RAM, a conta passaria facilmente dos R$ 150,00 ou R$ 200,00 por mês. Para quem está no início ou a ponto de escalar uma operação, esse custo fixo pesa.</p>
<p>Foi aí que decidi aceitar um desafio: <strong>Montar uma infraestrutura de nível "Enterprise" gastando exatamente R$ 0,00.</strong></p>
<p>Parece bom demais para ser verdade? Pois é, eu também achava. Mas descobri o <em>Oracle Cloud Always Free Tier</em>.</p>
<p><strong>O Setup dos Sonhos (E Gratuito)</strong></p>
<p>Diferentemente de outros provedores que oferecem "amostras grátis" por 30 dias, a Oracle disponibiliza (se houver capacidade de instanciação na zona escolhida) uma máquina <strong>ARM Ampere</strong> com até <strong>4 OCPUs e 24GB de RAM</strong> de forma permanente. Mesmo quando essa máquina está indisponível, conseguimos usar as instâncias AMD Micro, que são modestas, mas perfeitas para validar ambientes de teste e rodar serviços leves via Docker.</p>
<p>Nesta nova jornada técnica, migrei as minhas automações para lá e consegui:</p>
<ul>
<li><p><strong>Docker Puro:</strong> Controle total sobre as versões e containers.</p>
</li>
<li><p><strong>n8n Auto-hospedado:</strong> Sem limites de execução.</p>
</li>
<li><p><strong>Evolution API v2:</strong> Integração profissional com WhatsApp.</p>
</li>
<li><p><strong>Cloudflare Tunnel:</strong> A cereja no topo do bolo. Consegui HTTPS seguro e acesso externo sem precisar abrir uma única porta no firewall ou expor o IP do servidor.</p>
</li>
</ul>
<p><strong>Nem tudo são flores: Os Desafios</strong></p>
<p>Não vou mentir: não é "clicar e instalar". Sair da zona de conforto das hospedagens prontas exige sujar as mãos no terminal. Tive que lidar com chaves SSH, permissões de arquivos Linux, configuração de Swap (memória virtual) e arquivos YAML que não perdoam um espaço fora do lugar.</p>
<p>No entanto, o resultado final vale a pena. Agora possuo um servidor próprio, seguro e com alta performance, e ainda pude aprimorar minhas competências em DevOps.</p>
<p><strong>Acompanha a Série</strong></p>
<p>Acompanhe o blog nas próximas semanas! Vou detalhar, passo a passo e de forma técnica, como implementei este servidor de automação. Se o seu objetivo é aprender a montar o seu próprio servidor sem custos de licença, não perca.</p>
<p>Na próxima quinta-feira, vou explicar o primeiro passo crítico: <strong>Como criar a conta, gerar as chaves de segurança e aceder ao servidor sem ficar trancado do lado de fora.</strong></p>
<p>Até lá!</p>
]]></content:encoded></item><item><title><![CDATA[DaVinci Resolve on Linux: Solving the Codec Nightmare (With a little help from AI and Diolinux)]]></title><description><![CDATA[It all started with a very real problem right here at home. My wife, a primary school teacher locally, took on the herculean task of recording and editing a major school project. Suddenly, she found herself with around 500 raw videos and clips shot o...]]></description><link>https://blog.paulorabelo.dev.br/davinci-resolve-on-linux-solving-the-codec-nightmare-with-a-little-help-from-ai-and-diolinux</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/davinci-resolve-on-linux-solving-the-codec-nightmare-with-a-little-help-from-ai-and-diolinux</guid><category><![CDATA[Linux]]></category><category><![CDATA[davinci resolve]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[AI]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Video Editing]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Fri, 28 Nov 2025 03:15:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764299622077/4b2cf57b-ee30-43c4-a4a7-092ac474c9d8.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It all started with a very real problem right here at home. My wife, a primary school teacher locally, took on the herculean task of recording and editing a major school project. Suddenly, she found herself with around 500 raw videos and clips shot on various cell phones and digital cameras, needing to edit everything quickly and professionally from home.</p>
<p>The tool choice was obvious: DaVinci Resolve. It’s professional and offers the necessary organization and logging features to handle such a massive amount of footage.</p>
<p><strong>The Linux "Elephant in the Room"</strong></p>
<p>However, it wasn't smooth sailing. When we imported the files into the free version of DaVinci Resolve on Linux, we hit a brick wall: the software doesn't natively recognize the standard audio and video formats from most mobile phones (like H.264/H.265 codecs and AAC audio). The result? A screen full of "Media Offline" warnings for 500 files.</p>
<p>The industry-standard solution is transcoding to edit-friendly formats (like ProRes or DNxHR). But doing this manually, file by file, for hundreds of videos—and for new materials that kept arriving during the process—was humanly impossible. We needed a fast, automated solution.</p>
<p><strong>The Inspiration: The Open Source Legacy</strong></p>
<p>Remembering the culture of sharing, I turned to a classic solution from the Brazilian Linux community as a foundation: a script created years ago by Henrique from the <strong>Diolinux</strong> team and adapted by Mateus Müller. The structure was solid, but it needed an urgent update to handle the volume and variety of our modern workflow.</p>
<p><strong>AI Acceleration: Pair Programming to Solve the Problem</strong></p>
<p>With the school project deadline looming, there was no time to spend hours reading <code>ffmpeg</code> documentation or testing Bash loops. This is where the key to modern productivity stepped in: the use of AI with Gemini.</p>
<p>We took the original script and transformed it into a robust, hybrid tool. The process was accelerated learning focused squarely on solving the real-world problem: I defined the needs ("it needs to convert WhatsApp audio too," "it has to organize everything into subfolders so she doesn't get lost"), and the AI suggested the best technical implementations in seconds, explaining every line.</p>
<p><strong>The Result:</strong> <code>to_</code><a target="_blank" href="http://davinci.sh"><code>davinci.sh</code></a> <code>v2.0</code></p>
<p>The result was the salvation of the project. We created a script that:</p>
<ul>
<li><p>Recursively scans the media folders she receives.</p>
</li>
<li><p>Automatically identifies if it's video (MP4, MOV) or audio (M4A, MP3 from WhatsApp).</p>
</li>
<li><p>Applies the correct "recipe" for each (Video -&gt; MPEG4/PCM; Audio -&gt; WAV/PCM), generating files that DaVinci loves.</p>
</li>
<li><p>Automatically organizes everything into "converted" subfolders.</p>
</li>
</ul>
<p>It was a massive problem solved by uniting the legacy of open source with the speed of artificial intelligence. You can check out the full code we used, the usage manual, and drop a star on the GitHub repository below.</p>
<p><a target="_blank" href="https://github.com/paulorabelo/to-davinci-media-converter">https://github.com/paulorabelo/to-davinci-media-converter</a></p>
]]></content:encoded></item><item><title><![CDATA[DaVinci Resolve no Linux: Resolvendo o Pesadelo dos Codecs (Com uma ajudinha da IA e do Diolinux)]]></title><description><![CDATA[Tudo começou com um problema muito real aqui em casa. Minha esposa, que é professora do ensino fundamental no ABC, assumiu a tarefa hercúlea de gravar e editar um projeto escolar. De repente, ela tinha em mãos algo em torno de 500 vídeos brutos e tre...]]></description><link>https://blog.paulorabelo.dev.br/davinci-resolve-no-linux-resolvendo-o-pesadelo-dos-codecs-com-uma-ajudinha-da-ia-e-do-diolinux</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/davinci-resolve-no-linux-resolvendo-o-pesadelo-dos-codecs-com-uma-ajudinha-da-ia-e-do-diolinux</guid><category><![CDATA[davinci resolve]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[AI]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Video Editing]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Fri, 28 Nov 2025 03:12:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764299402050/14168fa0-7b85-405c-864f-facb575b919d.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Tudo começou com um problema muito real aqui em casa. Minha esposa, que é professora do ensino fundamental no ABC, assumiu a tarefa hercúlea de gravar e editar um projeto escolar. De repente, ela tinha em mãos algo em torno de 500 vídeos brutos e trechos gravados em celulares e câmeras digitais, e precisava editar tudo isso com qualidade e velocidade, trabalhando de casa.</p>
<p>A escolha da ferramenta era óbvia: o DaVinci Resolve. Ele é profissional e oferece os recursos de organização e decupagem necessários para lidar com essa quantidade massiva de material.</p>
<p><strong>O "Elefante na Sala" do Linux</strong></p>
<p>Mas, nem tudo são flores. Quando importamos os arquivos para a versão gratuita do DaVinci Resolve no Linux, esbarramos em uma parede: o software não reconhece nativamente os formatos de áudio e vídeo padrão da maioria dos celulares (como codecs H.264/H.265 e áudio AAC). O resultado? Uma tela cheia de "Mídia Offline" para 500 arquivos.</p>
<p>A solução padrão da indústria é transcodificar para formatos "amigáveis" à edição (como ProRes ou DNxHR). Mas fazer isso manualmente, arquivo por arquivo, para centenas de vídeos — e para os novos materiais que continuavam chegando durante o processo — era humanamente inviável. Precisávamos de uma solução rápida e automática.</p>
<p><strong>A Inspiração: O Legado do Software Livre</strong></p>
<p>Lembrando da cultura do compartilhamento, recorri a uma solução clássica da comunidade brasileira para usar como base: um script criado anos atrás pelo Henrique da equipe do <strong>Diolinux</strong> e adaptado pelo Mateus Müller. A estrutura era sólida, mas precisava de uma atualização urgente para lidar com o volume e a variedade do nosso fluxo de trabalho moderno.</p>
<p><strong>A Aceleração com IA: Programando em Dupla para Resolver o Problema</strong></p>
<p>Com a urgência do projeto escolar batendo à porta, não dava para passar horas lendo documentação do <code>ffmpeg</code> e testando loops em Bash. Aqui entrou a peça chave da produtividade moderna: o uso da inteligência artificial, o Gemini.</p>
<p>Pegamos o script original e o transformamos em uma ferramenta híbrida e robusta. O processo foi de um aprendizado acelerado focado na resolução do problema real: eu definia a necessidade ("precisa converter os áudios do WhatsApp também", "tem que organizar tudo em subpastas para ela não se perder"), e a IA sugeria as melhores implementações técnicas em segundos, explicando cada linha.</p>
<p><strong>O Resultado:</strong> <code>to_</code><a target="_blank" href="http://davinci.sh"><code>davinci.sh</code></a> <code>v2.0</code></p>
<p>O resultado foi a salvação do projeto. Criamos um script que:</p>
<ul>
<li><p>Varre recursivamente as pastas de mídia que ela recebe.</p>
</li>
<li><p>Identifica automaticamente se é vídeo (MP4, MOV) ou áudio (M4A, MP3 do WhatsApp).</p>
</li>
<li><p>Aplica a "receita" correta para cada um (Vídeo -&gt; MPEG4/PCM; Áudio -&gt; WAV/PCM), gerando arquivos que o DaVinci adora.</p>
</li>
<li><p>Organiza tudo automaticamente em pastas de "convertidos".</p>
</li>
</ul>
<p>Foi um problema grande resolvido com a união do legado do software livre e a velocidade da inteligência artificial. Você pode conferir o código completo que usamos, o manual de uso e deixar sua estrela no repositório do GitHub abaixo.</p>
<p><a target="_blank" href="https://github.com/paulorabelo/to-davinci-media-converter">https://github.com/paulorabelo/to-davinci-media-converter</a></p>
]]></content:encoded></item><item><title><![CDATA[O Terminal Ganhou Cérebro: Como turbinei meu Linux com Python e a API do Gemini]]></title><description><![CDATA[Todo estudante de engenharia ou desenvolvedor sabe: o terminal Linux é poderoso, mas às vezes pode ser implacável. Uma flag errada, um erro de sintaxe ou um log gigante podem nos fazer perder minutos preciosos no Google.
Como estou cursando Engenhari...]]></description><link>https://blog.paulorabelo.dev.br/o-terminal-ganhou-cerebro-como-turbinei-meu-linux-com-python-e-a-api-do-gemini</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/o-terminal-ganhou-cerebro-como-turbinei-meu-linux-com-python-e-a-api-do-gemini</guid><category><![CDATA[Linux]]></category><category><![CDATA[Python]]></category><category><![CDATA[#GoogleGemini]]></category><category><![CDATA[AI]]></category><category><![CDATA[engenharia-da-computacao]]></category><category><![CDATA[Developer]]></category><category><![CDATA[automation]]></category><category><![CDATA[automação]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Fri, 28 Nov 2025 02:14:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764295851633/be66abf8-95e6-4d25-a3ff-567b6568c0b4.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Todo estudante de engenharia ou desenvolvedor sabe: o terminal Linux é poderoso, mas às vezes pode ser implacável. Uma flag errada, um erro de sintaxe ou um log gigante podem nos fazer perder minutos preciosos no Google.</p>
<p>Como estou cursando Engenharia de Computação e já atuo com desenvolvimento, decidi unir o útil ao agradável (e inovador). E se o meu terminal pudesse não apenas executar comandos, mas <strong>entender</strong> o que estou fazendo?</p>
<p>Foi assim que nasceu meu projeto de final de semana: um assistente CLI integrado à API do Google Gemini.</p>
<h4 id="heading-a-engenharia-por-tras-da-magica">A Engenharia por trás da "Mágica" 🛠️</h4>
<p>A ideia não era criar um chatbot complexo, mas sim uma ferramenta que se integrasse ao fluxo nativo do Unix/Linux. Para isso, usei três ingredientes principais:</p>
<ol>
<li><p><strong>Python &amp; Venv:</strong> Para a lógica de script e isolamento do ambiente (boas práticas sempre!).</p>
</li>
<li><p><strong>Google Gemini API (Modelo 2.0 Flash):</strong> Pela velocidade insana e custo zero para desenvolvedores no tier gratuito.</p>
</li>
<li><p><strong>Unix Pipes (</strong><code>|</code>): A cereja do bolo.</p>
</li>
</ol>
<p><strong>💡 Um toque de Engenharia de Software: Segurança</strong></p>
<p>Durante o desenvolvimento, uma decisão importante foi como gerenciar a chave da API. Em vez de colocá-la direto no código (o que é uma falha de segurança grave conhecida como <em>hardcoding</em>), optei por usar <strong>Variáveis de Ambiente</strong> do sistema operacional.</p>
<p>Isso segue o princípio de "Configuração" da metodologia <strong>The Twelve-Factor App</strong>, padrão ouro em desenvolvimento moderno. O código fica limpo e seguro no GitHub, enquanto a chave secreta fica guardada apenas na configuração local do meu terminal (<code>.zshrc</code>).</p>
<h4 id="heading-o-poder-do-pipe-llm">O Poder do Pipe (<code>|</code>) + LLM</h4>
<p>A grande sacada foi implementar a leitura do <code>STDIN</code> (Standard Input). Isso permite que eu faça encadeamentos como:</p>
<p>Bash</p>
<pre><code class="lang-bash">cat erro_gigante.log | ajuda <span class="hljs-string">"Onde está a falha aqui?"</span>
</code></pre>
<p>Ou até mesmo listar arquivos e pedir explicações contextuais:</p>
<p>Bash</p>
<pre><code class="lang-bash">ls -la | ajuda <span class="hljs-string">"Qual script Python desta pasta é o mais pesado?"</span>
</code></pre>
<p>O script captura a saída do comando anterior, anexa minha pergunta e envia tudo para a IA, que atua como um "Engenheiro Sênior" me dando a resposta mastigada direto no terminal.</p>
<h4 id="heading-por-que-isso-importa">Por que isso importa?</h4>
<p>Estamos vivendo a era da IA, mas muitas vezes ficamos presos ao "copia e cola" do navegador. Trazer a inteligência artificial para dentro do terminal (<code>CLI</code>) elimina o atrito. Eu não saio do meu ambiente de trabalho, mantenho o foco e resolvo problemas em segundos.</p>
<p>Isso é a essência da Engenharia de Computação: usar as ferramentas disponíveis para otimizar processos e criar soluções elegantes.</p>
<p>E você, já pensou em integrar IA nos seus scripts do dia a dia? O código é mais simples do que parece! Se quiser dar uma olhadinha o código está disponível no Github abaixo:</p>
<p><strong>GitHub:</strong> <a target="_blank" href="https://github.com/paulorabelo/terminal-ai">https://github.com/paulorabelo/terminal-ai</a></p>
]]></content:encoded></item><item><title><![CDATA[The Terminal Has a Brain: Supercharging my Linux Workflow with Python and the Google Gemini API]]></title><description><![CDATA[Every engineering student or developer knows the feeling: the Linux terminal is incredibly powerful, but sometimes unforgiving. A wrong flag, a syntax error, or a massive, cryptic log file can cost precious minutes lost in Google searches.
As a Compu...]]></description><link>https://blog.paulorabelo.dev.br/the-terminal-has-a-brain-supercharging-my-linux-workflow-with-python-and-the-google-gemini-api</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/the-terminal-has-a-brain-supercharging-my-linux-workflow-with-python-and-the-google-gemini-api</guid><category><![CDATA[Linux]]></category><category><![CDATA[Python 3]]></category><category><![CDATA[#GoogleGemini]]></category><category><![CDATA[AI]]></category><category><![CDATA[#ComputerEngineering]]></category><category><![CDATA[Developer]]></category><category><![CDATA[automation]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Fri, 28 Nov 2025 02:06:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764295007884/4224791b-8faf-4b75-920c-7e6b3abb0424.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every engineering student or developer knows the feeling: the Linux terminal is incredibly powerful, but sometimes unforgiving. A wrong flag, a syntax error, or a massive, cryptic log file can cost precious minutes lost in Google searches.</p>
<p>As a Computer Engineering student already working in development, I decided to combine utility with innovation. I asked myself: What if my terminal could not just execute commands, but actually <strong>understand</strong> context?</p>
<p>That’s how my weekend project was born: a native CLI assistant integrated directly with the Google Gemini API.</p>
<h4 id="heading-the-engineering-behind-the-magic">The Engineering Behind the "Magic" 🛠️</h4>
<p>The goal wasn't to build a complex, standalone chatbot application. I wanted a tool that integrated seamlessly into the native Unix/Linux workflow. To achieve this, I used three key ingredients:</p>
<ol>
<li><p><strong>Python &amp; Venv:</strong> For robust scripting logic and environment isolation (always following best practices!).</p>
</li>
<li><p><strong>Google Gemini API (Model 2.0 Flash):</strong> Chosen for its insane speed and zero cost for developers on the free tier.</p>
</li>
<li><p><strong>Unix Pipes (</strong><code>|</code>): The real game-changer.</p>
</li>
</ol>
<p><strong>💡 A touch of Software Engineering: Security</strong></p>
<p>During development, a crucial decision was how to manage the API key. Instead of hardcoding it directly into the source code (a major security flaw), I chose to use OS <strong>Environment Variables</strong>.</p>
<p>This follows the "Config" principle of the <strong>The Twelve-Factor App</strong> methodology, a gold standard in modern development. The code remains clean and safe on GitHub, while the secret key is stored securely only in my local terminal configuration (<code>.zshrc</code>).</p>
<h4 id="heading-the-power-of-the-pipe-llm">The Power of the Pipe (<code>|</code>) + LLM</h4>
<p>The breakthrough feature was implementing the reading of <code>STDIN</code> (Standard Input) in the Python script. This allows for powerful command chaining.</p>
<p>Instead of copy-pasting errors into a browser, I can now do this:</p>
<p>Bash</p>
<pre><code class="lang-bash">cat giant_error.log | ajuda <span class="hljs-string">"Where is the critical failure here?"</span>
</code></pre>
<p>Or even list files and ask for contextual explanations based on metadata:</p>
<p>Bash</p>
<pre><code class="lang-bash">ls -la | ajuda <span class="hljs-string">"Which Python script in this folder is the largest, and what does its name suggest it does?"</span>
</code></pre>
<p>The script captures the stdout of the previous command, appends my specific question, and sends the payload to the AI. The AI then acts like a "Senior Engineer," delivering a concise, readable answer straight back to my terminal output.</p>
<h4 id="heading-why-this-matters">Why This Matters</h4>
<p>We are living in the AI era, yet we often find ourselves stuck in the "browser copy-paste loop." Bringing Artificial Intelligence directly inside the terminal (<code>CLI</code>) eliminates this friction.</p>
<p>I don't have to leave my development environment, I maintain my flow state, and I solve problems in seconds. To me, this is the essence of Computer Engineering: leveraging available tools to optimize processes and create elegant solutions.</p>
<p>What about you? Have you thought about integrating AI into your daily automation scripts? The code is often simpler than it seems! You can find the full source code on GitHub:</p>
<p>GitHub: <a target="_blank" href="https://github.com/paulorabelo/terminal-ai">https://github.com/paulorabelo/terminal-ai</a></p>
]]></content:encoded></item><item><title><![CDATA[Maximizing Your Hardware with GPU Passthrough]]></title><description><![CDATA[If you've ever wondered if there's a way to get the most out of your hardware without having to constantly reboot your system, the answer is yes! The technique is called GPU Passthrough and it allows a virtual machine (VM) to access the GPU directly,...]]></description><link>https://blog.paulorabelo.dev.br/maximizing-your-hardware-with-gpu-passthrough</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/maximizing-your-hardware-with-gpu-passthrough</guid><category><![CDATA[GPU]]></category><category><![CDATA[GPU passthrough]]></category><category><![CDATA[advanced linux]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Dual booting]]></category><category><![CDATA[vm]]></category><category><![CDATA[KVM]]></category><category><![CDATA[virt-manager]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Mon, 10 Mar 2025 01:55:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1741571331468/2db57055-ae12-4a7a-97e0-2a2629a1dbea.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you've ever wondered if there's a way to get the most out of your hardware without having to constantly reboot your system, the answer is yes! The technique is called GPU Passthrough and it allows a virtual machine (VM) to access the GPU directly, significantly improving the VM's graphical performance. It's especially useful for games and 3D applications that require a lot of graphical resources.</p>
<p>For GPU Passthrough, you'll need a processor that supports virtualization technology (like Intel VT-d or AMD-Vi), two GPUs (one for the host and one for the VM), and enough RAM for both the host and the VM. Not all hardware is compatible with GPU Passthrough. You'll need to check if your processor, motherboard, and GPUs support this technology.</p>
<p>KVM (Kernel-based Virtual Machine) is a full virtualization solution for Linux, while Virt-Manager is a graphical user interface for managing VMs. You'll need to install both on your system. IOMMU (Input-Output Memory Management Unit) is a technology that allows a device's hardware to directly access the system memory. It's required for GPU Passthrough and needs to be enabled in the BIOS.</p>
<p>After configuring VFIO, you'll need to update the initramfs to apply the changes. Now you can create the VM using Virt-Manager. During creation, you can select the 'Customize configuration before install' option and add your GPU as a PCI device. Finally, install the guest operating system on the VM. After it's installed, you can install the GPU drivers as usual.</p>
<p>Remember that GPU Passthrough is an advanced technique that may require a lot of troubleshooting. Always back up your data before you start and don't hesitate to seek help if you run into problems.</p>
]]></content:encoded></item><item><title><![CDATA[Career Change at 40: How to Become a Software Developer]]></title><description><![CDATA[Have you ever thought about changing careers at 40? Maybe you’re unhappy with your current job, or maybe you want to learn a new skill and take on new challenges. Whatever the reason, changing careers at 40 is not impossible. In fact, it can be a gre...]]></description><link>https://blog.paulorabelo.dev.br/career-change-at-40-how-to-become-a-software-developer</link><guid isPermaLink="true">https://blog.paulorabelo.dev.br/career-change-at-40-how-to-become-a-software-developer</guid><category><![CDATA[Developer]]></category><category><![CDATA[Java]]></category><category><![CDATA[Rust]]></category><category><![CDATA[C]]></category><category><![CDATA[C#]]></category><category><![CDATA[40+]]></category><dc:creator><![CDATA[Paulo Rabelo]]></dc:creator><pubDate>Mon, 10 Mar 2025 01:33:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1741569395393/47260221-7f75-4a67-a4a5-ed3cf3bbf352.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Have you ever thought about changing careers at 40? Maybe you’re unhappy with your current job, or maybe you want to learn a new skill and take on new challenges. Whatever the reason, changing careers at 40 is not impossible. In fact, it can be a great opportunity to reinvent yourself and adapt to market demands.</p>
<p>One of the most promising and sought-after careers today is that of a software developer. Software developers are responsible for creating, testing, and maintaining computer programs that meet the needs of users. They can work in a variety of areas, such as games, applications, operating systems, artificial intelligence, etc.</p>
<p>But how do you become a software developer at 40? Do you need a specific degree or advanced knowledge of mathematics? How long does it take to learn to program? What are the best programming languages ​​to start with? These are some of the questions you may be asking yourself. In this post, we will try to answer these and other questions and give you some tips to start your journey as a software developer.</p>
<p>First, it is important to know that there is no single way or path to become a software developer. Each person has their own pace, style and learning preferences. In addition, there are different types and levels of software development, which require different skills and knowledge.</p>
<p>A basic concept that you need to understand is the difference between backend, frontend and fullstack. The backend is the part of the software that is "behind" the graphical interface, that is, it is the code that handles the logic, data and communication with other systems. The frontend is the part of the software that is "in front" of the graphical interface, that is, it is the code that defines how the software appears to the user, such as colors, buttons, menus, etc. The fullstack is the combination of the backend and the frontend, that is, it is the developer who masters both areas.</p>
<p>Depending on the type of software you want to create, you can either specialize in one of these areas or become a full-stack developer. Each area has its advantages and disadvantages, as well as its own most commonly used programming languages.</p>
<p>Programming languages ​​are the languages ​​that developers use to write software code. There are hundreds of different programming languages, each with its own characteristics, syntaxes, and applications. Some languages ​​are easier to learn than others, some are more popular than others, and some are better suited for certain types of software than others.</p>
<p>To start your career as a software developer at 40, you don't need to learn every programming language out there. In fact, that would be impossible and unnecessary. What you need to do is choose one or a few languages ​​that are relevant to your goal and that are compatible with your level of knowledge.</p>
<p>A good way to choose a programming language is to research which ones are most in demand in the market, which ones are most recommended for beginners, and which ones are best suited for the type of software you want to create. You can also consult online platforms that offer courses, tutorials and practical projects to learn how to program.</p>
<p>Some of the most popular and versatile programming languages ​​today are Java, C/C++ and Rust. Java is an object-oriented, cross-platform language widely used to develop applications for web, desktop and mobile devices. C/C++ are compiled, fast and powerful languages ​​used to develop operating systems, games and complex software. Rust is a modern, safe and efficient language used to develop high-performance and reliable software.</p>
<p>These are just some of the options you have to start your career as a software developer at 40 years old. The important thing is that you don't give up on your dream and that you are willing to learn and constantly update yourself. Remember that programming is a skill that develops with practice and experience. The more you program, the more you will learn and improve.</p>
<p>I hope this post was useful and inspiring for you. If you liked it, share it with your friends and leave a comment. See you next time!</p>
]]></content:encoded></item></channel></rss>