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

<channel>
	<title>laravel Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<atom:link href="https://leonardonascimento.dev/tag/laravel/feed/" rel="self" type="application/rss+xml" />
	<link>https://leonardonascimento.dev/tag/laravel/</link>
	<description>Especializado em backend, APIs e sistemas escaláveis. Experiência em arquitetura de sistemas, integrações, mensageria, performance e aplicações de alta disponibilidade.</description>
	<lastBuildDate>Fri, 30 Jan 2026 02:50:50 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://leonardonascimento.dev/wp-content/uploads/2021/05/cropped-programming-32x32.png</url>
	<title>laravel Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<link>https://leonardonascimento.dev/tag/laravel/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Sistema completo de cobranças via WhatsApp: boleto, Pix e NF-e na prática</title>
		<link>https://leonardonascimento.dev/blog/sistema-completo-de-cobrancas-via-whatsapp-boleto-pix-e-nf/</link>
					<comments>https://leonardonascimento.dev/blog/sistema-completo-de-cobrancas-via-whatsapp-boleto-pix-e-nf/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Fri, 30 Jan 2026 11:00:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Dicas & Truques]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Produção]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[api banco inter]]></category>
		<category><![CDATA[api rest]]></category>
		<category><![CDATA[automação financeira]]></category>
		<category><![CDATA[boleto banco inter]]></category>
		<category><![CDATA[boleto registrado]]></category>
		<category><![CDATA[cache redis]]></category>
		<category><![CDATA[cobrança automatizada]]></category>
		<category><![CDATA[cobrança recorrente]]></category>
		<category><![CDATA[cron laravel]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[inadimplência]]></category>
		<category><![CDATA[integração banco inter]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[laravel 8]]></category>
		<category><![CDATA[laravel scheduler]]></category>
		<category><![CDATA[ligação automática]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[oauth2]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[php-fpm]]></category>
		<category><![CDATA[pix api]]></category>
		<category><![CDATA[pix dinâmico]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[sistema de cobranças]]></category>
		<category><![CDATA[sms cobrança]]></category>
		<category><![CDATA[webhooks]]></category>
		<category><![CDATA[whatsapp api]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2360</guid>

					<description><![CDATA[<p>Automatizar cobranças nunca foi simples. Entre regras bancárias, vencimentos, Pix, boletos registrados, notificações, inadimplência e conciliação, a maioria dos sistemas acaba virando um emaranhado de scripts difíceis de manter. Neste artigo, vou mostrar como funciona, na prática, um sistema real de cobrança construído em Laravel, integrando Boleto e Pix do Banco Inter, com webhooks, PDFs, [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/sistema-completo-de-cobrancas-via-whatsapp-boleto-pix-e-nf/">Sistema completo de cobranças via WhatsApp: boleto, Pix e NF-e na prática</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><a href="https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/" type="post" id="2316">Automatizar </a>cobranças nunca foi simples. Entre regras bancárias, vencimentos, Pix, boletos registrados, notificações, inadimplência e conciliação, a maioria dos sistemas acaba virando um emaranhado de scripts difíceis de manter.</p>



<p>Neste artigo, vou mostrar <strong>como funciona, na prática</strong>, um sistema real de cobrança construído em <strong><a href="https://leonardonascimento.dev/categoria/laravel" type="link" id="https://leonardonascimento.dev/categoria/laravel" target="_blank" rel="noreferrer noopener nofollow">Laravel</a></strong>, integrando <strong>Boleto e Pix do Banco Inter</strong>, com <strong>webhooks</strong>, <strong>PDFs</strong>, <strong>crons</strong>, <strong>Docker</strong>, <strong>e-mails</strong>, <strong>WhatsApp</strong>, <strong>SMS</strong> e até <strong>ligações automáticas</strong>.</p>



<p>Todo o conteúdo é baseado em um projeto open source real, usado em produção, disponível no GitHub:</p>



<p>👉 <strong>Repositório:</strong><br><a href="https://github.com/leonardop21/boleto-inter-free">https://github.com/leonardop21/boleto-inter-free</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Importante: este não é um “tutorial de Hello World”. É um guia técnico completo, voltado para quem quer <strong>entender arquitetura</strong>, <strong>evitar erros comuns</strong> e <strong>colocar cobrança automática em produção com segurança</strong>.</p>
</blockquote>



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



<h2 class="wp-block-heading" id="h-por-que-integrar-diretamente-com-o-banco-inter">Por que integrar diretamente com o Banco Inter?</h2>



<p>O Banco Inter oferece uma <a href="https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/" type="post" id="2358">API </a>robusta para PJ, com suporte nativo a:</p>



<ul class="wp-block-list">
<li>Boletos registrados</li>



<li>Pix com QR Code dinâmico</li>



<li>Webhooks de status</li>



<li>Consulta de cobranças</li>



<li>Download de PDFs</li>



<li>Extratos bancários</li>
</ul>



<p>Ao integrar diretamente com o Inter, você elimina intermediários, reduz custos e ganha controle total sobre o fluxo financeiro.</p>



<p>Mas isso vem com desafios:</p>



<ul class="wp-block-list">
<li>Certificados mTLS</li>



<li>OAuth2</li>



<li>Regras rígidas de vencimento</li>



<li>Webhooks que precisam ser idempotentes</li>



<li>PDFs que precisam ser armazenados ou regenerados</li>



<li>Conciliação automática</li>
</ul>



<p>É exatamente isso que o projeto resolve.</p>



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



<h2 class="wp-block-heading" id="h-visao-geral-da-arquitetura-do-sistema">Visão geral da arquitetura do sistema</h2>



<p>Antes de entrar em código, é importante entender <strong>como o sistema foi pensado</strong>.</p>



<h3 class="wp-block-heading" id="h-componentes-principais">Componentes principais</h3>



<ul class="wp-block-list">
<li><strong>Laravel 8</strong> como base</li>



<li><strong>MySQL</strong> para dados transacionais</li>



<li><strong>Redis</strong> para cache com tags</li>



<li><strong>Banco Inter API</strong> para cobranças</li>



<li><strong>Notifish</strong> para WhatsApp</li>



<li><strong>SMTP</strong> para e-mails</li>



<li><strong>SMS Dev</strong> para SMS</li>



<li><strong>King SMS (Voicer)</strong> para ligações</li>



<li><strong>Docker + Nginx + PHP-FPM</strong> em produção</li>
</ul>



<p>Nada aqui é experimental. Tudo foi pensado para <strong>rodar 24/7</strong>, com falhas previsíveis e logs rastreáveis.</p>



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



<h2 class="wp-block-heading" id="h-por-que-redis-e-obrigatorio-neste-projeto">Por que Redis é obrigatório neste projeto?</h2>



<p>Um erro comum em sistemas de cobrança é <strong>consultar a API do banco o tempo todo</strong>.</p>



<p>Esse projeto evita isso usando <strong>cache agressivo com tags</strong>, por exemplo:</p>



<ul class="wp-block-list">
<li>Cache de cobranças</li>



<li>Cache de clientes</li>



<li>Cache de serviços</li>



<li>Cache de status de boletos e Pix</li>
</ul>



<p>Quando um boleto muda de status (via webhook), o cache relacionado é invalidado.</p>



<p>👉 Sem Redis (ou Memcached), o sistema <strong>não funciona corretamente</strong>.</p>



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



<h2 class="wp-block-heading" id="h-instalacao-do-projeto-ambiente-local">Instalação do projeto (ambiente local)</h2>



<h3 class="wp-block-heading" id="h-1-clonando-o-repositorio">1. Clonando o repositório</h3>



<pre class="wp-block-code"><code>git clone https://github.com/leonardop21/boleto-inter-free.git
cd boleto-inter-free
composer install
</code></pre>



<h3 class="wp-block-heading" id="h-2-configuracao-inicial">2. Configuração inicial</h3>



<pre class="wp-block-code"><code>cp .env.example .env
php artisan key:generate
</code></pre>



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



<h2 class="wp-block-heading" id="h-configurando-o-banco-de-dados-e-cache">Configurando o banco de dados e cache</h2>



<p>No <code>.env</code>:</p>



<pre class="wp-block-code"><code>DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=boleto_inter
DB_USERNAME=user
DB_PASSWORD=pass

CACHE_DRIVER=redis
SESSION_DRIVER=redis
TIME_CACHE_IN_SECONDS=604800
</code></pre>



<p>Depois:</p>



<pre class="wp-block-code"><code>php artisan migrate
</code></pre>



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



<h2 class="wp-block-heading" id="h-como-funciona-o-modelo-de-cobranca">Como funciona o modelo de cobrança</h2>



<p>O sistema foi pensado para <strong>cobrança recorrente</strong>, mas funciona também para cobranças pontuais.</p>



<h3 class="wp-block-heading" id="h-entidades-principais">Entidades principais</h3>



<ul class="wp-block-list">
<li><strong>Cliente</strong></li>



<li><strong>Serviço</strong></li>



<li><strong>Cliente x Serviço</strong></li>



<li><strong>Boleto</strong></li>



<li><strong>Pix</strong></li>



<li><strong>NF-e (opcional)</strong></li>
</ul>



<p>O fluxo é simples:</p>



<ol class="wp-block-list">
<li>Você cadastra um cliente</li>



<li>Cadastra um serviço</li>



<li>Vincula o serviço ao cliente</li>



<li>O sistema gera boletos ou Pix automaticamente</li>
</ol>



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



<h2 class="wp-block-heading" id="h-integracao-com-o-banco-inter-parte-critica">Integração com o Banco Inter (parte crítica)</h2>



<h3 class="wp-block-heading" id="h-certificados-mtls">Certificados mTLS</h3>



<p>O Inter exige:</p>



<ul class="wp-block-list">
<li>Um arquivo <code>.crt</code></li>



<li>Um arquivo <code>.key</code></li>
</ul>



<p>No <code>.env</code>:</p>



<pre class="wp-block-code"><code>INTER_PATH_CRT=/caminho/inter.crt
INTER_PATH_KEY=/caminho/inter.key
</code></pre>



<h3 class="wp-block-heading" id="h-oauth2">OAuth2</h3>



<pre class="wp-block-code"><code>INTER_CLIENT_ID=seu_client_id
INTER_CLIENT_SECRET=seu_client_secret
INTER_CLIENT_SCOPE="extrato.read boleto-cobranca.read boleto-cobranca.write"
INTER_BASE_URL="https://cdpj.partners.bancointer.com.br/"
</code></pre>



<p>Sem isso, <strong>nenhuma requisição funciona</strong>.</p>



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



<h2 class="wp-block-heading" id="h-webhooks-o-coracao-da-automacao">Webhooks: o coração da automação</h2>



<p>O sistema registra dois webhooks no Inter:</p>



<ul class="wp-block-list">
<li><strong>Boleto</strong></li>



<li><strong>Pix</strong></li>
</ul>



<pre class="wp-block-code"><code>INTER_WEBHOOK_URL=https://seusite.com/api/inter/webhook/boleto
INTER_WEBHOOK_URL_PIX=https://seusite.com/api/inter/webhook/pix
</code></pre>



<h3 class="wp-block-heading" id="h-o-que-acontece-quando-um-pagamento-e-feito">O que acontece quando um pagamento é feito?</h3>



<ol class="wp-block-list">
<li>O Inter chama o webhook</li>



<li>O sistema valida a assinatura</li>



<li>Atualiza o status da cobrança</li>



<li>Invalida caches relacionados</li>



<li>Registra logs</li>



<li>(Opcional) dispara notificações internas</li>
</ol>



<p>Isso evita:</p>



<ul class="wp-block-list">
<li>Jobs de polling</li>



<li>Consultas desnecessárias</li>



<li>Status desatualizado</li>
</ul>



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



<h2 class="wp-block-heading" id="h-geracao-automatica-de-boletos">Geração automática de boletos</h2>



<p>Este é um dos pontos mais sofisticados do projeto.</p>



<p>Comando:</p>



<pre class="wp-block-code"><code>php artisan ln:auto_generate_boleto
</code></pre>



<h3 class="wp-block-heading" id="h-regras-implementadas">Regras implementadas</h3>



<ul class="wp-block-list">
<li>Se o dia de vencimento já passou → gera para o mês seguinte</li>



<li>Se o cliente escolheu dia 31 → ajusta para último dia do mês</li>



<li>Respeita meses com 28, 29, 30 ou 31 dias</li>



<li>Evita boletos duplicados</li>



<li>Gera PDF automaticamente</li>



<li>Salva logs detalhados</li>
</ul>



<p>Tudo isso roda <strong>sem intervenção humana</strong>.</p>



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



<h2 class="wp-block-heading" id="h-geracao-automatica-de-pix">Geração automática de Pix</h2>



<p>Comando:</p>



<pre class="wp-block-code"><code>php artisan ln:auto_generate_pix
</code></pre>



<ul class="wp-block-list">
<li>Gera QR Code</li>



<li>Gera payload Pix</li>



<li>Cria cobrança no Inter</li>



<li>Registra vencimento</li>



<li>Gera imagem do QR Code (GD)</li>
</ul>



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



<h2 class="wp-block-heading" id="h-envio-de-cobrancas-por-e-mail">Envio de cobranças por e-mail</h2>



<p>O sistema envia:</p>



<ul class="wp-block-list">
<li>Boleto em PDF</li>



<li>Pix com QR Code</li>



<li>NF-e (se configurado)</li>
</ul>



<p>Configuração SMTP no <code>.env</code>:</p>



<pre class="wp-block-code"><code>MAIL_HOST=
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls
</code></pre>



<p>Além disso, o layout do e-mail é personalizável:</p>



<ul class="wp-block-list">
<li>Logo</li>



<li>Cor de fundo</li>



<li>Links de suporte</li>
</ul>



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



<h2 class="wp-block-heading" id="h-envio-por-whatsapp-notifish">Envio por WhatsApp (Notifish)</h2>



<p>Integração direta com a API do <a href="https://notifish.com/">Notifish</a>.</p>



<pre class="wp-block-code"><code>NOTIFISH_BASE_URL=https://seu.notifish.com/api/v2/
NOTIFISH_API_KEY=sua_key
NOTIFISH_UUID=sua_instancia
</code></pre>



<p>O sistema gera uma <strong>URL assinada temporária</strong> para o PDF do boleto, válida por poucos minutos — sem expor IDs internos.</p>



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



<h2 class="wp-block-heading" id="h-sms-e-ligacoes-automaticas-para-inadimplentes">SMS e ligações automáticas para inadimplentes</h2>



<h3 class="wp-block-heading" id="h-sms">SMS</h3>



<pre class="wp-block-code"><code>php artisan ln:send-boleto-sms
php artisan ln:send-pix-sms
</code></pre>



<h3 class="wp-block-heading" id="h-ligacao-voz-robotica">Ligação (voz robótica)</h3>



<pre class="wp-block-code"><code>php artisan ln:send-boleto-voicer
php artisan ln:send-pix-voicer
</code></pre>



<p>Isso é usado <strong>somente após o vencimento</strong>, como camada extra de cobrança.</p>



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



<h2 class="wp-block-heading" id="h-crons-como-tudo-roda-sozinho">Crons: como tudo roda sozinho</h2>



<p>Você <strong>não agenda cada comando individualmente</strong>.</p>



<p>Apenas:</p>



<pre class="wp-block-code"><code>* * * * * php artisan schedule:run
</code></pre>



<p>O Laravel Scheduler cuida do resto.</p>



<p>Exemplo:</p>



<ul class="wp-block-list">
<li>Dia 1 → gera boletos</li>



<li>Antes do vencimento → envia lembrete</li>



<li>Após vencimento → cobrança progressiva</li>
</ul>



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



<h2 class="wp-block-heading" id="h-docker-em-producao">Docker em produção</h2>



<p>O projeto já vem com:</p>



<ul class="wp-block-list">
<li><code>Dockerfile</code></li>



<li><code>docker-compose.prod.yml</code></li>



<li>Nginx configurado</li>



<li>PHP-FPM otimizado</li>



<li>Redis</li>



<li>MySQL</li>
</ul>



<p>Subir produção:</p>



<pre class="wp-block-code"><code>docker compose -f docker-compose.prod.yml up -d --build
</code></pre>



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



<h2 class="wp-block-heading" id="h-logs-rastreabilidade-e-auditoria">Logs, rastreabilidade e auditoria</h2>



<p>Cada processo tem seu próprio log:</p>



<ul class="wp-block-list">
<li>Boletos</li>



<li>Pix</li>



<li>NF-e</li>



<li>Webhooks</li>



<li>Erros de API</li>
</ul>



<p>Isso é fundamental para:</p>



<ul class="wp-block-list">
<li>Suporte</li>



<li>Auditoria</li>



<li>Contabilidade</li>



<li>Diagnóstico rápido</li>
</ul>



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



<h2 class="wp-block-heading" id="h-para-quem-este-projeto-e-indicado">Para quem este projeto é indicado?</h2>



<ul class="wp-block-list">
<li>Desenvolvedores PHP/Laravel</li>



<li>SaaS com cobrança recorrente</li>



<li>Sistemas internos de empresas</li>



<li>Agências que querem padronizar cobrança</li>



<li>Projetos que precisam de autonomia financeira</li>
</ul>



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



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



<p>Automatizar cobranças não é só “gerar boleto”.<br>É lidar com:</p>



<ul class="wp-block-list">
<li>Datas</li>



<li>Erros bancários</li>



<li>Comunicação</li>



<li>Inadimplência</li>



<li>Escala</li>



<li>Observabilidade</li>
</ul>



<p>Este projeto resolve isso de forma <strong>pragmática</strong>, <strong>realista</strong> e <strong>testada em produção</strong>.</p>



<p>👉 Repositório completo:<br><a href="https://github.com/leonardop21/boleto-inter-free">https://github.com/leonardop21/boleto-inter-free</a></p>



<p></p>
<p>The post <a href="https://leonardonascimento.dev/blog/sistema-completo-de-cobrancas-via-whatsapp-boleto-pix-e-nf/">Sistema completo de cobranças via WhatsApp: boleto, Pix e NF-e na prática</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/sistema-completo-de-cobrancas-via-whatsapp-boleto-pix-e-nf/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Arquitetura de uma API REST em Laravel preparada para produção</title>
		<link>https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/</link>
					<comments>https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Wed, 28 Jan 2026 22:44:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Dicas & Truques]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[api rest]]></category>
		<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[autenticação api]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[ci/cd]]></category>
		<category><![CDATA[clean architecture]]></category>
		<category><![CDATA[desenvolvimento backend]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[docker compose]]></category>
		<category><![CDATA[documentação api]]></category>
		<category><![CDATA[engenharia de software]]></category>
		<category><![CDATA[github actions]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[laravel sanctum]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[projeto para portfólio]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[repository pattern]]></category>
		<category><![CDATA[service layer]]></category>
		<category><![CDATA[swagger]]></category>
		<category><![CDATA[testes automatizados]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2358</guid>

					<description><![CDATA[<p>Em processos seletivos técnicos, não basta entregar código funcional. Cada vez mais, empresas avaliam arquitetura, decisões técnicas, organização do projeto, automação e capacidade de escalar a solução. Este artigo detalha a arquitetura de uma API REST desenvolvida em Laravel para gerenciamento de tarefas, criada como parte de um teste técnico, mas estruturada como um projeto [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/">Arquitetura de uma API REST em Laravel preparada para produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Em processos seletivos técnicos, não basta entregar código funcional. Cada vez mais, empresas avaliam <strong>arquitetura, decisões técnicas, organização do projeto, automação e capacidade de escalar a solução</strong>.</p>



<p>Este artigo detalha a arquitetura de uma <strong><a href="https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/" type="post" id="2290">API REST</a> desenvolvida em Laravel para gerenciamento de tarefas</strong>, <a href="https://github.com/leonardop21/laravel-task" type="link" id="https://github.com/leonardop21/laravel-task" target="_blank" rel="noreferrer noopener nofollow">criada como parte de um teste técnico,</a> mas estruturada como um projeto <strong>pronto para produção</strong>, seguindo boas práticas amplamente utilizadas em ambientes corporativos.</p>



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



<h2 class="wp-block-heading" id="h-visao-geral-da-solucao">Visão geral da solução</h2>



<p>A aplicação consiste em uma <strong>API RESTful para gerenciamento de tarefas</strong>, com suporte a:</p>



<ul class="wp-block-list">
<li>Autenticação via Bearer Token (Laravel Sanctum)</li>



<li>CRUD completo de tarefas</li>



<li>Marcação de tarefas como concluídas</li>



<li>Cache de consultas com Redis</li>



<li>Banco de dados PostgreSQL</li>



<li>Documentação interativa via Swagger</li>



<li>Ambiente Dockerizado (dev, test e prod)</li>



<li>Testes automatizados</li>



<li>Pipeline de CI/CD com GitHub Actions</li>
</ul>



<p>O foco não foi apenas “fazer funcionar”, mas <strong>pensar a aplicação como um produto escalável e previsível</strong>.</p>



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



<h2 class="wp-block-heading" id="h-decisao-arquitetural-api-stateless-e-autenticacao">Decisão arquitetural: API stateless e autenticação</h2>



<p>A API foi construída como <strong>stateless</strong>, utilizando <strong>Bearer Token via Laravel Sanctum</strong>.</p>



<h3 class="wp-block-heading" id="h-beneficios-dessa-abordagem">Benefícios dessa abordagem:</h3>



<ul class="wp-block-list">
<li>Facilidade de integração com frontends (SPA, mobile, terceiros)</li>



<li>Independência de sessão</li>



<li>Escalabilidade horizontal</li>



<li>Compatibilidade com gateways, load balancers e proxies</li>
</ul>



<p>A autenticação é desacoplada do fluxo de negócio, o que facilita manutenção e evolução futura.</p>



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



<h2 class="wp-block-heading" id="h-postgresql-como-banco-principal">PostgreSQL como banco principal</h2>



<p>A escolha do <strong>PostgreSQL</strong> não foi aleatória. Ele é amplamente utilizado em ambientes corporativos por oferecer:</p>



<ul class="wp-block-list">
<li>Confiabilidade transacional</li>



<li>Suporte avançado a índices</li>



<li>Tipos de dados ricos</li>



<li>Excelente desempenho em cenários complexos</li>
</ul>



<p>Isso torna a aplicação preparada para crescer sem precisar trocar a base de dados no curto ou médio prazo.</p>



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



<h2 class="wp-block-heading" id="h-redis-como-camada-de-cache">Redis como camada de cache</h2>



<p>Para reduzir carga no banco e melhorar tempo de resposta, foi implementado <strong>cache com Redis</strong>, com TTL de 120 segundos nas consultas mais comuns.</p>



<h3 class="wp-block-heading" id="h-beneficios-diretos">Benefícios diretos:</h3>



<ul class="wp-block-list">
<li>Redução de queries repetitivas</li>



<li>Menor latência</li>



<li>Melhor desempenho sob carga</li>



<li>Escalabilidade em leitura</li>
</ul>



<p>Essa abordagem demonstra preocupação com <strong>performance real</strong>, não apenas com lógica funcional.</p>



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



<h2 class="wp-block-heading" id="h-arquitetura-limpa-repository-pattern-service-layer">Arquitetura limpa: Repository Pattern + Service Layer</h2>



<p><a href="https://leonardonascimento.dev/blog/php-alem-do-crud-como-escrever-codigo-que-nao-vira-problema-em-producao/" type="post" id="2348">A aplicação segue princípios de <strong>Clean Architecture</strong></a>, separando responsabilidades de forma clara:</p>



<ul class="wp-block-list">
<li><strong>Controllers</strong>: recebem requisições e retornam respostas</li>



<li><strong>Services</strong>: concentram regras de negócio</li>



<li><strong>Repositories</strong>: isolam o acesso a dados</li>



<li><strong>Models</strong>: representam as entidades</li>
</ul>



<h3 class="wp-block-heading" id="h-vantagens-dessa-separacao">Vantagens dessa separação:</h3>



<ul class="wp-block-list">
<li>Código mais legível</li>



<li>Facilidade de testes</li>



<li>Menor acoplamento</li>



<li>Evolução segura do domínio</li>
</ul>



<p>Essa estrutura é comum em times maduros e projetos de longo prazo.</p>



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



<h2 class="wp-block-heading" id="h-docker-como-base-do-ambiente">Docker como base do ambiente</h2>



<p>Toda a aplicação roda em <strong>Docker</strong>, com ambientes bem definidos:</p>



<h3 class="wp-block-heading" id="h-desenvolvimento">Desenvolvimento</h3>



<ul class="wp-block-list">
<li>Código em volume</li>



<li>Hot reload</li>



<li>PostgreSQL + Redis + Nginx</li>



<li>Testes executados automaticamente</li>
</ul>



<h3 class="wp-block-heading" id="h-producao">Produção</h3>



<ul class="wp-block-list">
<li>Build otimizado</li>



<li>Código embutido na imagem</li>



<li>Assets compilados no build</li>



<li>Sem dependência de volume</li>
</ul>



<p>Essa separação reduz o clássico problema de “funciona na minha máquina” e aproxima o ambiente local da produção.</p>



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



<h2 class="wp-block-heading" id="h-testes-automatizados-como-parte-do-fluxo">Testes automatizados como parte do fluxo</h2>



<p>A aplicação conta com <strong>testes unitários e de feature</strong>, executados de três formas:</p>



<ul class="wp-block-list">
<li>Localmente no ambiente dev</li>



<li>Isoladamente via Docker</li>



<li>Automaticamente no CI/CD</li>
</ul>



<p>Isso garante:</p>



<ul class="wp-block-list">
<li>Segurança para refatorações</li>



<li>Detecção precoce de bugs</li>



<li>Confiança na entrega contínua</li>
</ul>



<p>Testes não são tratados como opcional, mas como <strong>parte da arquitetura</strong>.</p>



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



<h2 class="wp-block-heading" id="h-ci-cd-com-github-actions">CI/CD com GitHub Actions</h2>



<p>Cada push ou pull request dispara um workflow que:</p>



<ol class="wp-block-list">
<li>Sobe toda a stack Docker (app, banco, cache)</li>



<li>Executa migrations</li>



<li>Roda a suíte completa de testes</li>



<li>Bloqueia o merge em caso de falha</li>
</ol>



<p>Esse processo simula um pipeline real de empresas que operam com <strong>entrega contínua e qualidade de código como requisito</strong>.</p>



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



<h2 class="wp-block-heading" id="h-documentacao-com-swagger">Documentação com Swagger</h2>



<p>A API possui <strong>documentação interativa via Swagger</strong>, acessível após subir a aplicação.</p>



<p>Isso permite:</p>



<ul class="wp-block-list">
<li>Testes manuais rápidos</li>



<li>Onboarding mais fácil</li>



<li>Comunicação clara entre backend e frontend</li>



<li>Uso por terceiros sem dependência de documentação externa</li>
</ul>



<p>Documentação é tratada como parte do produto, não como etapa posterior.</p>



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



<h2 class="wp-block-heading" id="h-beneficios-dessa-arquitetura-em-um-contexto-profissional">Benefícios dessa arquitetura em um contexto profissional</h2>



<p>Essa abordagem entrega vantagens claras em ambientes reais:</p>



<ul class="wp-block-list">
<li>Código organizado e previsível</li>



<li>Facilidade de manutenção</li>



<li>Escalabilidade técnica</li>



<li>Padronização de ambientes</li>



<li>Menor risco em deploys</li>



<li>Base sólida para crescimento</li>
</ul>



<p>Não se trata apenas de uma API de tarefas, mas de <strong>um modelo replicável para aplicações reais</strong>.</p>



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



<h2 class="wp-block-heading" id="h-o-que-esse-projeto-demonstra-tecnicamente">O que esse projeto demonstra tecnicamente</h2>



<p>Esse projeto evidencia competências como:</p>



<ul class="wp-block-list">
<li><a href="http://leonardonascimento.dev/categoria/laravel">Domínio de Laravel além do básico</a></li>



<li>Conhecimento de arquitetura backend</li>



<li>Uso consciente de cache e banco</li>



<li>Experiência com Docker e ambientes reais</li>



<li>Cultura de testes</li>



<li>Automação de CI/CD</li>



<li>Pensamento orientado a produto e escala</li>
</ul>



<p>São exatamente esses pontos que diferenciam um desenvolvedor <strong>pleno/sênior</strong> em processos seletivos.</p>



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



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



<p>Mais do que cumprir um teste técnico, o objetivo deste projeto foi demonstrar <strong>capacidade de pensar sistemas como um todo</strong>, indo além do CRUD simples.</p>



<p>Arquitetura, automação, testes e previsibilidade são o que tornam uma aplicação sustentável — e é isso que empresas buscam quando contratam profissionais para projetos de longo prazo.</p>



<p></p>



<p><a href="https://github.com/leonardop21/laravel-task" target="_blank" rel="noreferrer noopener nofollow">Link do teste prático</a></p>
<p>The post <a href="https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/">Arquitetura de uma API REST em Laravel preparada para produção</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/arquitetura-de-uma-api-rest-em-laravel-preparada-para-producao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Deployment de Laravel no Cloud com CI/CD (GitHub Actions e GitLab CI)</title>
		<link>https://leonardonascimento.dev/blog/deployment-de-laravel-no-cloud-com-ci-cd-github-actions-e-gitlab-ci/</link>
					<comments>https://leonardonascimento.dev/blog/deployment-de-laravel-no-cloud-com-ci-cd-github-actions-e-gitlab-ci/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Tue, 13 Jan 2026 15:26:32 +0000</pubDate>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Produção]]></category>
		<category><![CDATA[ci/cd]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[produção]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2295</guid>

					<description><![CDATA[<p>Deploy manual funciona até o dia em que deixa de funcionar. Enquanto o projeto é pequeno e o time é reduzido, subir código via SSH, rodar alguns comandos e torcer para dar certo parece aceitável. Em projetos reais, com mais gente mexendo, deploy frequente e produção rodando 24/7, isso vira risco operacional. CI/CD não é [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/deployment-de-laravel-no-cloud-com-ci-cd-github-actions-e-gitlab-ci/">Deployment de Laravel no Cloud com CI/CD (GitHub Actions e GitLab CI)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Deploy manual funciona até o dia em que deixa de funcionar. Enquanto o projeto é pequeno e o time é reduzido, subir código via SSH, rodar alguns comandos e torcer para dar certo parece aceitável. Em projetos reais, com mais gente mexendo, deploy frequente e produção rodando 24/7, isso vira risco operacional.</p>



<p>CI/CD não é sobre velocidade. É sobre <strong>previsibilidade, repetibilidade e segurança</strong> no processo de entrega.</p>



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



<h2 class="wp-block-heading" id="h-o-que-ci-cd-realmente-resolve-em-projetos-laravel">O que CI/CD realmente resolve em projetos Laravel</h2>



<p>Em aplicações Laravel, o pipeline de deploy resolve três problemas clássicos:</p>



<ol class="wp-block-list">
<li><strong>Ambiente inconsistente</strong><br>O código roda local, mas quebra em produção porque algo foi esquecido ou executado fora de ordem.</li>



<li><strong>Deploys inseguros</strong><br>Código sobe sem testes, sem validação, sem rollback fácil.</li>



<li><strong>Processo dependente de pessoas</strong><br>“Só fulano sabe fazer deploy”. Quando ele não está, ninguém sobe nada.</li>
</ol>



<p>CI/CD elimina esses pontos ao transformar deploy em <strong>processo automatizado</strong>, não em ritual manual.</p>



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



<h2 class="wp-block-heading" id="h-conceito-basico-do-pipeline-independente-da-ferramenta">Conceito básico do pipeline (independente da ferramenta)</h2>



<p>Antes de falar de GitHub Actions ou GitLab CI, é importante entender o fluxo lógico. Um pipeline de Laravel bem definido costuma ter estas etapas:</p>



<ol class="wp-block-list">
<li><strong>Checkout do código</strong></li>



<li><strong>Instalação de dependências</strong></li>



<li><strong>Execução de testes</strong></li>



<li><strong>Build (quando aplicável)</strong></li>



<li><strong>Deploy</strong></li>



<li><strong>Pós-deploy (migrations, cache, filas)</strong></li>
</ol>



<p>Se qualquer etapa falhar, o deploy <strong>não acontece</strong>. Isso é uma proteção, não um obstáculo.</p>



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



<h2 class="wp-block-heading" id="h-estrutura-minima-de-um-deploy-laravel-saudavel">Estrutura mínima de um deploy Laravel saudável</h2>



<p>Independente de cloud ou CI, alguns princípios não mudam:</p>



<ul class="wp-block-list">
<li><code>composer install</code> sempre em modo produção</li>



<li><code>.env</code> nunca versionado</li>



<li><code>APP_ENV</code> e <code>APP_DEBUG</code> corretos</li>



<li>migrations rodando de forma controlada</li>



<li>cache/config/views limpos e recompilados</li>



<li>workers reiniciados corretamente</li>
</ul>



<p>Se isso não estiver automatizado, o risco é constante.</p>



<h2 class="wp-block-heading">Exemplo de pipeline com GitHub Actions</h2>



<p>Um pipeline simples, mas funcional, usando GitHub Actions:</p>



<pre class="wp-block-preformatted">name: Deploy Laravel<br><br>on:<br>  push:<br>    branches:<br>      - main<br><br>jobs:<br>  deploy:<br>    runs-on: ubuntu-latest<br><br>    steps:<br>      - name: Checkout<br>        uses: actions/checkout@v4<br><br>      - name: Setup PHP<br>        uses: shivammathur/setup-php@v2<br>        with:<br>          php-version: '8.2'<br>          extensions: mbstring, pdo, pdo_mysql<br><br>      - name: Install dependencies<br>        run: composer install --no-dev --optimize-autoloader<br><br>      - name: Run tests<br>        run: php artisan test<br><br>      - name: Deploy via SSH<br>        uses: appleboy/ssh-action@v1<br>        with:<br>          host: ${{ secrets.SERVER_HOST }}<br>          username: ${{ secrets.SERVER_USER }}<br>          key: ${{ secrets.SERVER_SSH_KEY }}<br>          script: |<br>            cd /var/www/app<br>            git pull origin main<br>            composer install --no-dev --optimize-autoloader<br>            php artisan migrate --force<br>            php artisan optimize<br>            php artisan queue:restart</pre>



<h2 class="wp-block-heading">Onde muita gente erra no deploy de Laravel</h2>



<h3 class="wp-block-heading">Rodar migration sem pensar em impacto</h3>



<p>Migration em produção pode travar tabela, gerar lentidão ou indisponibilidade. CI/CD não elimina isso. Ele apenas automatiza. Migration precisa ser escrita com consciência de produção.</p>



<h3 class="wp-block-heading">Cache mal tratado</h3>



<p>Não limpar/recriar cache de config e routes gera bugs difíceis de explicar. Cache antigo em produção é clássico.</p>



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



<p>Deploy sobe código novo, mas workers continuam rodando código antigo. Resultado: comportamento inconsistente.</p>



<h3 class="wp-block-heading">Falta de rollback</h3>



<p>CI/CD sem rollback é metade da solução. Mesmo que seja manual, precisa existir um caminho claro para voltar.</p>



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



<h2 class="wp-block-heading">Estratégia simples de rollback</h2>



<p>Mesmo sem blue/green ou canary, dá para ter rollback básico:</p>



<ul class="wp-block-list">
<li>manter tags ou releases</li>



<li>usar <code>git checkout</code> para versão anterior</li>



<li>rodar <code>php artisan migrate:rollback</code> quando aplicável</li>



<li>reiniciar workers</li>
</ul>



<p>O importante é <strong>ter plano</strong>. Não improvisar sob pressão.</p>



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



<h2 class="wp-block-heading">CI/CD não substitui observabilidade</h2>



<p>Deploy automatizado reduz erro humano, mas não impede bugs. Por isso, CI/CD precisa andar junto com:</p>



<ul class="wp-block-list">
<li>monitoramento de erros</li>



<li>alertas pós-deploy</li>



<li>logs estruturados</li>



<li>métricas de saúde</li>
</ul>



<p>Deploy sem visibilidade é só um erro mais rápido.</p>



<p>CI/CD em projetos Laravel não é luxo nem modinha. É uma camada básica de segurança operacional. Ele garante que o código passe sempre pelo mesmo caminho, reduz risco humano e cria previsibilidade no processo de entrega.</p>



<p>Quando o deploy deixa de ser um evento tenso e vira algo rotineiro, o time ganha confiança para evoluir o sistema. E isso, no fim, é o que permite crescer sem quebrar tudo a cada release.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/deployment-de-laravel-no-cloud-com-ci-cd-github-actions-e-gitlab-ci/">Deployment de Laravel no Cloud com CI/CD (GitHub Actions e GitLab CI)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/deployment-de-laravel-no-cloud-com-ci-cd-github-actions-e-gitlab-ci/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Erros comuns ao usar Redis em aplicações Laravel</title>
		<link>https://leonardonascimento.dev/blog/erros-comuns-ao-usar-redis-em-aplicacoes-laravel/</link>
					<comments>https://leonardonascimento.dev/blog/erros-comuns-ao-usar-redis-em-aplicacoes-laravel/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Sun, 11 Jan 2026 10:47:00 +0000</pubDate>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[concorrência]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[produção]]></category>
		<category><![CDATA[redis]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2282</guid>

					<description><![CDATA[<p>Redis costuma entrar no projeto como sinônimo de performance. E, de fato, quando bem usado, ele resolve muita coisa. O problema é que em aplicações Laravel — principalmente quando começam a crescer — Redis também vira fonte de bugs difíceis, inconsistências e comportamentos estranhos quando é usado sem critério. A maioria desses problemas não vem [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/erros-comuns-ao-usar-redis-em-aplicacoes-laravel/">Erros comuns ao usar Redis em aplicações Laravel</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Redis costuma entrar no projeto como sinônimo de <a href="https://leonardonascimento.dev/tag/performance/" type="post_tag" id="209">performance</a>. E, de fato, quando bem usado, ele resolve muita coisa. O problema é que em aplicações Laravel — principalmente quando começam a crescer — Redis também vira fonte de bugs difíceis, inconsistências e comportamentos estranhos quando é usado sem critério.</p>



<p>A maioria desses problemas não vem do Redis em si, mas da forma como ele é integrado à aplicação. A seguir estão erros que aparecem com frequência em produção e o que aprender com eles.</p>



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



<p>Um dos erros mais comuns é <strong>tratar Redis como banco de dados principal</strong>. Redis é rápido, mas não é fonte de verdade. Dados em memória podem ser perdidos por restart, eviction ou falha de infraestrutura. Quando o sistema depende do Redis para manter estado crítico, qualquer limpeza vira incidente. Em aplicações maduras, Redis é sempre camada auxiliar; o banco relacional continua sendo a referência.</p>



<p>Outro problema recorrente é <strong><a href="https://leonardonascimento.dev/blog/quando-usar-cache-e-quando-ele-so-complica-o-sistema/" type="post" id="2251">cachear dados sem estratégia clara de invalidação</a></strong>. No começo, tudo parece funcionar: menos queries, respostas mais rápidas. Com o tempo, começam a aparecer dados desatualizados, comportamentos inconsistentes e bugs que “somem sozinhos”. Cache sem invalidação bem definida vira dívida técnica. Toda entrada em cache precisa ter resposta clara para três perguntas: quando expira, quem invalida e o que acontece se falhar.</p>



<p>Também é comum <strong>usar TTL genérico para tudo</strong>. Definir o mesmo tempo de expiração para dados completamente diferentes ignora o contexto. Dados quase estáticos podem ficar horas em cache; dados sensíveis a mudanças podem precisar de expiração curta ou invalidação ativa. TTL não é detalhe de configuração, é parte da regra de negócio.</p>



<p>Em projetos com filas e jobs, aparece bastante o erro de <strong>usar Redis sem pensar em concorrência</strong>. Dois workers acessando e alterando a mesma chave ao mesmo tempo geram condição de corrida. Incrementos, flags e estados intermediários precisam ser atômicos ou protegidos por lock. Ignorar isso funciona em teste, mas quebra sob carga.</p>



<p>Outro ponto crítico é <strong>usar Redis como solução para idempotência sem persistência complementar</strong>. Locks e flags em Redis ajudam, mas não garantem segurança total. Se o Redis reiniciar, o controle some. Para efeitos colaterais críticos (pagamento, notificação, integração externa), o controle final precisa estar no banco, com constraint ou registro explícito de processamento.</p>



<p>Muitos projetos também caem no erro de <strong>não separar namespaces ou prefixos de chave</strong>. Em aplicações maiores, isso gera colisão, dificuldade de debug e limpeza perigosa. Padronizar prefixos por domínio ou tipo de dado facilita manutenção e evita apagar cache errado.</p>



<p>Há ainda o uso excessivo de Redis para <strong>resolver problemas que não são de cache</strong>. Guardar lógica de negócio, estados complexos ou fluxos longos em memória costuma deixar o sistema frágil. Redis é ótimo para acelerar acesso, coordenar concorrência e compartilhar estado temporário, mas não substitui modelagem correta.</p>



<p>Outro erro que só aparece em produção é <strong>ignorar política de eviction e limites de memória</strong>. Quando a memória acaba, o Redis começa a remover chaves de acordo com a política configurada. Se isso não foi considerado no design, o sistema passa a perder cache crítico aleatoriamente, causando degradação inesperada. Monitorar uso de memória e entender eviction é obrigatório.</p>



<p>Também é comum <strong>não monitorar Redis como dependência crítica</strong>. Quando ele fica lento ou indisponível, a aplicação sofre. Sem métricas, alertas e logs específicos, o diagnóstico demora. Redis precisa estar no radar de observabilidade tanto quanto banco e API externa.</p>



<p>Por fim, um erro sutil: <strong>acoplar demais o código ao Redis</strong>. Quando a aplicação assume que Redis sempre está disponível, qualquer fallback vira difícil. Código mais saudável trata Redis como otimização opcional: se falhar, o sistema continua funcionando, mesmo que mais lento.</p>



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



<p>Redis é uma ferramenta poderosa, mas exige disciplina. <a href="https://leonardonascimento.dev/categoria/laravel/" type="category" id="44">Em aplicações Laravel</a>, ele deve acelerar, proteger e coordenar — nunca sustentar a lógica principal do sistema. Quando tratado como camada auxiliar, com invalidação clara, controle de concorrência e observabilidade, ele entrega o que promete. Quando usado como atalho, cobra o preço em produção.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/erros-comuns-ao-usar-redis-em-aplicacoes-laravel/">Erros comuns ao usar Redis em aplicações Laravel</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/erros-comuns-ao-usar-redis-em-aplicacoes-laravel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Boas práticas para estruturar projetos em Laravel de médio e grande porte</title>
		<link>https://leonardonascimento.dev/blog/boas-praticas-para-estruturar-projetos-em-laravel-de-medio-e-grande-porte/</link>
					<comments>https://leonardonascimento.dev/blog/boas-praticas-para-estruturar-projetos-em-laravel-de-medio-e-grande-porte/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Wed, 07 Jan 2026 14:12:16 +0000</pubDate>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Produção]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[código sustentável]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[estrutura de projeto]]></category>
		<category><![CDATA[laravel]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2262</guid>

					<description><![CDATA[<p>Quando o projeto Laravel é pequeno, quase qualquer organização funciona. Você cria controllers, models, requests, alguns services, resolve tudo no “app/” e segue. O problema começa quando o sistema cresce: mais módulos, mais regras, integrações, filas, diferentes times mexendo no mesmo lugar… e, de repente, o que era simples vira uma base difícil de evoluir. [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/boas-praticas-para-estruturar-projetos-em-laravel-de-medio-e-grande-porte/">Boas práticas para estruturar projetos em Laravel de médio e grande porte</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Quando o projeto <a href="https://leonardonascimento.dev/categoria/laravel/" type="category" id="44">Laravel </a>é pequeno, quase qualquer organização funciona. Você cria controllers, models, requests, alguns services, resolve tudo no “app/” e segue. O problema começa quando o sistema cresce: mais módulos, mais regras, integrações, filas, diferentes times mexendo no mesmo lugar… e, de repente, o que era simples vira uma base difícil de evoluir.</p>



<p>Estruturar um projeto Laravel bem não é sobre “<a href="https://leonardonascimento.dev/categoria/arquitetura/" type="category" id="217">inventar arquitetura</a>”. É sobre reduzir atrito: facilitar manutenção, evitar acoplamento desnecessário e deixar o código previsível para quem chega depois.</p>



<p>A seguir estão práticas que funcionam bem em projetos médios e grandes, especialmente quando já existe operação de produção, roadmap e mudanças frequentes.</p>



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



<h2 class="wp-block-heading">Comece pela regra: controller não é lugar de lógica</h2>



<p>Controller deveria orquestrar: receber request, validar, chamar a camada certa e responder. Quando regra de negócio fica no controller, você cria um ponto de acoplamento difícil de testar e difícil de reutilizar. Em projeto grande isso vira padrão ruim rapidamente, porque todo mundo copia o que já existe.</p>



<p>O que funciona melhor é mover lógica para classes dedicadas (services/use cases/actions), e deixar o controller como uma “casca” fina. Você ganha clareza, reaproveitamento e testes mais simples.</p>



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



<h2 class="wp-block-heading">Estruture por domínio (feature) quando o sistema crescer</h2>



<p>A estrutura padrão do Laravel (Controllers, Models, Jobs, etc.) é ótima até um certo ponto. Em sistemas grandes, ela tende a espalhar a mesma funcionalidade por várias pastas e o dev precisa “caçar” arquivos para entender um fluxo.</p>



<p>Uma abordagem que escala melhor é organizar por <strong>domínio/feature</strong>. Exemplo: tudo relacionado a “Billing” fica próximo (requests, actions, policies, resources, etc.). Isso reduz a fricção para manter e evoluir partes específicas do sistema.</p>



<p>Você não precisa mudar tudo de uma vez. Dá para começar com um ou dois domínios e ir migrando aos poucos, sem reescrever o projeto inteiro.</p>



<h3 class="wp-block-heading">Estrutura tradicional do Laravel (por tipo)</h3>



<pre class="wp-block-preformatted">app/<br>├── Http/<br>│   ├── Controllers/<br>│   ├── Requests/<br>│   └── Resources/<br>├── Models/<br>├── Jobs/<br>├── Policies/<br>├── Services/</pre>



<p>Problema em projeto grande:<br>para entender <strong>Billing</strong>, você precisa abrir 6 pastas diferentes.</p>



<p>Estrutura por domínio / feature</p>



<p>app/<br>└── Domains/<br>└── Billing/<br>├── Http/<br>│ ├── Controllers/<br>│ ├── Requests/<br>│ └── Resources/<br>├── Actions/<br>├── Jobs/<br>├── Policies/<br>├── Models/<br>└── Services/</p>



<p>Ou até mais simples:</p>



<pre class="wp-block-preformatted">app/<br>└── Billing/<br>    ├── BillingController.php<br>    ├── CreateInvoice.php<br>    ├── Invoice.php<br>    ├── InvoicePolicy.php<br>    ├── SendInvoiceJob.php<br>    └── InvoiceResource.php</pre>



<p>O Laravel não se importa com a pasta, desde que o namespace esteja correto.</p>



<h2 class="wp-block-heading">Por que isso escala melhor?</h2>



<p>Porque quando alguém entra no projeto e precisa mexer em Billing:</p>



<ul class="wp-block-list">
<li>não precisa caçar arquivos espalhados</li>



<li>não quebra coisas de outros domínios</li>



<li>entende o fluxo mais rápido</li>



<li>reduz medo de alterar código</li>
</ul>



<p>Em projeto grande, isso faz <strong>muita diferença</strong>.</p>



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



<h2 class="wp-block-heading">Requests e validações como primeiro filtro</h2>



<p>Em projeto grande, dado ruim entrando vira bug caro. Centralizar validação em <strong>Form Requests</strong> mantém o controller limpo e torna regras de entrada explícitas.</p>



<p>Além disso, vale padronizar:</p>



<ul class="wp-block-list">
<li>mensagens de erro;</li>



<li>formatos de resposta (principalmente APIs);</li>



<li>validações compartilhadas (traits, rules customizadas).</li>
</ul>



<p>Quando a validação é consistente, o sistema vira mais previsível e o time para de reinventar a roda a cada endpoint.</p>



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



<h2 class="wp-block-heading">Padronize respostas de API desde cedo</h2>



<p>Quando cada <a href="https://leonardonascimento.dev/tag/api/" type="post_tag" id="210">endpoint </a>responde de um jeito, cada client precisa de lógica diferente, e isso vira dívida técnica distribuída. Para projetos médios e grandes, uma camada consistente de resposta é obrigatória: Resources, transformers, ou uma padronização interna.</p>



<p>O ponto aqui não é “estética”. É operação. Quando algo quebra, você quer logs previsíveis, payload previsível, erros previsíveis. Isso reduz tempo de diagnóstico.</p>



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



<h2 class="wp-block-heading">Regras de negócio: não misture persistência com decisão</h2>



<p>Um erro comum em Laravel é “decidir” coisas dentro de models e ao mesmo tempo persistir em todo lugar, sem fronteira clara. Em sistemas maiores, o ideal é separar:</p>



<ul class="wp-block-list">
<li><strong>Decisão / regra</strong> (o que pode ou não pode)</li>



<li><strong>Persistência</strong> (salvar, consultar)</li>



<li><strong>Orquestração</strong> (fluxo do caso de uso)</li>
</ul>



<p>Isso permite evoluir regra sem quebrar camada de persistência, e vice-versa. E facilita testar o que realmente importa: a regra.</p>



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



<h2 class="wp-block-heading">Jobs, filas e idempotência não são detalhe</h2>



<p>Em projeto grande, você inevitavelmente vai para filas: e-mails, notificações, integrações, processamento pesado. O que quebra sistemas grandes não é “usar fila”. É usar fila sem cuidado com:</p>



<ul class="wp-block-list">
<li>idempotência (job rodar duas vezes sem duplicar efeito);</li>



<li>retries (quando deve tentar de novo e quando deve falhar);</li>



<li>timeouts;</li>



<li>dead letter / estratégia para falhas recorrentes;</li>



<li>logs por job.</li>
</ul>



<p>Se o seu projeto depende de integração externa, trate isso como cenário normal: o externo vai falhar. A fila é o lugar certo para absorver isso, desde que bem desenhado.</p>



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



<h2 class="wp-block-heading">Serviços externos: isole e trate como dependência instável</h2>



<p>Integrações externas deveriam estar em classes próprias (clients/adapters), com:</p>



<ul class="wp-block-list">
<li>timeout explícito;</li>



<li>tratamento de erro consistente;</li>



<li>retry controlado quando fizer sentido;</li>



<li>logs contextualizados.</li>
</ul>



<p>Evite espalhar <code>Http::post()</code> por todo lugar. Em projeto grande isso vira caos, porque não existe ponto único para ajustar comportamento (ex: mudar header, adicionar auth, alterar timeout).</p>



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



<h2 class="wp-block-heading">Migrations, seeds e dados de referência bem cuidados</h2>



<p>Projeto grande normalmente tem muita migration. E migration desorganizada vira armadilha: ambientes quebram, dev novo não sobe projeto, staging fica inconsistente.</p>



<p>Boas práticas que ajudam:</p>



<ul class="wp-block-list">
<li>migrations com nomes claros;</li>



<li>dados de referência (enums/tabelas fixas) com seeders idempotentes;</li>



<li>evitar “seed que depende de estado manual”;</li>



<li>sempre testar “do zero” em ambiente limpo.</li>
</ul>



<p>Isso evita que o setup do projeto vire uma gincana.</p>



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



<h2 class="wp-block-heading">Configuração: tudo em config e .env, nada hardcoded</h2>



<p>Quando cresce, o sistema precisa rodar em múltiplos ambientes e, muitas vezes, múltiplos clientes. Configuração hardcoded vira problema de deploy e vira risco de segurança.</p>



<p>Padronize:</p>



<ul class="wp-block-list">
<li><code>config/*.php</code> como fonte de configuração;</li>



<li><code>.env</code> apenas para valores variáveis;</li>



<li>nunca commitar senhas e keys;</li>



<li>e preferencialmente separar integrações por “config + service container”.</li>
</ul>



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



<h2 class="wp-block-heading">Observabilidade: logs estruturados desde o começo</h2>



<p>Em projetos grandes, o custo de “descobrir o que aconteceu” é alto. Sem logs bons você perde tempo, perde confiança e perde previsibilidade operacional.</p>



<p>O que vale padronizar:</p>



<ul class="wp-block-list">
<li>logs com contexto (tenant, user_id, request_id, correlation_id);</li>



<li>níveis corretos (info, warning, error);</li>



<li>logs de integrações e jobs;</li>



<li>e um formato consistente (para facilitar busca).</li>
</ul>



<p>Isso é o que transforma incidentes em diagnóstico rápido.</p>



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



<h2 class="wp-block-heading">Testes: foque no que dá retorno real</h2>



<p>Não dá para testar tudo em projeto grande, e tentar fazê-lo costuma falhar. O que dá mais retorno é:</p>



<ul class="wp-block-list">
<li>testes de regras de negócio (unit/integration);</li>



<li>testes de fluxos críticos;</li>



<li>testes de contratos de API;</li>



<li>e testes de integração com serviços externos (com mocks ou ambientes controlados).</li>
</ul>



<p>Teste não é para “subir porcentagem”. É para reduzir risco onde mais dói.</p>



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



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



<p>Projetos Laravel grandes não quebram porque Laravel é limitado. Eles quebram porque a base cresce sem estrutura, sem padrões e sem fronteiras claras entre responsabilidades.</p>



<p>Se você mantiver controllers finos, separar domínio/feature, isolar integrações, tratar filas com seriedade e padronizar validação/retorno/log, o projeto continua evoluindo sem virar um monstro. E o melhor: o time consegue manter velocidade sem sacrificar estabilidade.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/boas-praticas-para-estruturar-projetos-em-laravel-de-medio-e-grande-porte/">Boas práticas para estruturar projetos em Laravel de médio e grande porte</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/boas-praticas-para-estruturar-projetos-em-laravel-de-medio-e-grande-porte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hospede seu site em um servidor Cloud por menos de R$ 11 Mês</title>
		<link>https://leonardonascimento.dev/blog/hospede-seu-site-em-um-servidor-cloud-por-menos-de-r-11-mes/</link>
					<comments>https://leonardonascimento.dev/blog/hospede-seu-site-em-um-servidor-cloud-por-menos-de-r-11-mes/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Sun, 20 Oct 2024 23:55:15 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[acesso remoto]]></category>
		<category><![CDATA[acesso SSH]]></category>
		<category><![CDATA[anti-spam]]></category>
		<category><![CDATA[aplicações]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[balanceador de carga]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[como configurar um servidor web]]></category>
		<category><![CDATA[compartilhada]]></category>
		<category><![CDATA[configuração]]></category>
		<category><![CDATA[consumo]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[CronJob]]></category>
		<category><![CDATA[disco]]></category>
		<category><![CDATA[downgrade]]></category>
		<category><![CDATA[e-mails]]></category>
		<category><![CDATA[editor de arquivos]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[gerenciador de banco de dados]]></category>
		<category><![CDATA[GitLab]]></category>
		<category><![CDATA[hospedagem]]></category>
		<category><![CDATA[hospedagem boa e barata 2023]]></category>
		<category><![CDATA[hospedagem laravel barata]]></category>
		<category><![CDATA[hospedagem wordress barata]]></category>
		<category><![CDATA[Hostoo]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[Linode]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[melhor hospedagem de 2022]]></category>
		<category><![CDATA[melhor hospedagem de 2023]]></category>
		<category><![CDATA[migração]]></category>
		<category><![CDATA[onde hospedar meu site]]></category>
		<category><![CDATA[painel de controle]]></category>
		<category><![CDATA[PHPMyAdmin]]></category>
		<category><![CDATA[qual o melhor lugar pra hospedar site]]></category>
		<category><![CDATA[RAM]]></category>
		<category><![CDATA[recarga]]></category>
		<category><![CDATA[restauração]]></category>
		<category><![CDATA[revenda]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[servidor barato]]></category>
		<category><![CDATA[servidor cloud barato]]></category>
		<category><![CDATA[servidor php barato]]></category>
		<category><![CDATA[servidor vps barato]]></category>
		<category><![CDATA[servidor web configurado]]></category>
		<category><![CDATA[servidor web configurável]]></category>
		<category><![CDATA[servidor wordpress barato]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[suporte]]></category>
		<category><![CDATA[tecnologia]]></category>
		<category><![CDATA[tráfego]]></category>
		<category><![CDATA[upgrade]]></category>
		<category><![CDATA[valor]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=251</guid>

					<description><![CDATA[<p>Não tem conhecimento de como configurar um servidor Cloud ou simplesmente não quer ter dores de cabeça para gerenciar um Servidor? Calma que...</p>
<p>The post <a href="https://leonardonascimento.dev/blog/hospede-seu-site-em-um-servidor-cloud-por-menos-de-r-11-mes/">Hospede seu site em um servidor Cloud por menos de R$ 11 Mês</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Seja para quem é iniciante ou dinossauro na área de tecnologia, sempre fica aquela dúvida, qual o melhor e mais barato serviço de hospedagem atualmente? Hospedagem Cloud ou compartilhada? (Compartilhada não quero mais nem de graça). Se você já tem um certo conhecimento, claro que compensa muito mais <a rel="noreferrer noopener" href="http://bit.ly/3gfVBud" data-type="URL" data-id="http://bit.ly/3gfVBud" target="_blank">configurar seu próprio servidor</a> e alocar seus clientes, a desvantagem é que você fica responsável por praticamente tudo, configurar gerenciador de hospedagem, e-mails, quedas de serviços entre outros, neste caso, recomendo a <a rel="noreferrer noopener" href="http://bit.ly/3gfVBud" data-type="URL" data-id="http://bit.ly/3gfVBud" target="_blank">Linode, sem medo de errar.</a></p>



<p>Porém, todavia, entretanto, contudo, se você não tem um grande conhecimento em gerenciamento de hospedagens, ou simplesmente não quer se incomodar em prestar suporte para o seu cliente, <a href="https://bit.ly/3f83PxE" data-type="URL" data-id="https://bit.ly/3f83PxE" target="_blank" rel="noreferrer noopener">poderá muito bem optar por um Cloud 100% configurado com:</a></p>



<ul class="wp-block-list">
<li>Servidor Cloud individual (Apenas o seu site hospedado no Cloud)</li>



<li>E-mails ilimitados</li>



<li>SSL grátis</li>



<li>Firewall</li>



<li>Tráfego ilimitado</li>



<li>Banco de dados ilimitados</li>



<li>Backup grátis</li>



<li>Acesso SSH</li>



<li>Software anti-spam para e-mails</li>



<li>Upgrade/Downgrade de plano direto pelo painel, sem precisar abrir ticket e sem downtime</li>



<li>Suporte grátis</li>



<li>Instalações de aplicações com poucos cliques</li>



<li>Revenda de  hospedagem</li>



<li>Plugin de cache (WordPress)</li>



<li>Editor de arquivos</li>



<li>FTP</li>



<li>Deploy pelo GitLab em breve Github e Bitbucket</li>



<li>Restauração de backup em poucos cliques</li>



<li>Gerenciador de banco de dados (PHPMYADMIN)</li>



<li>Acesso remoto ao banco de dados</li>



<li>Escolher entre Mysql e PostgreSQL</li>



<li>Balanceador de carga</li>



<li>Escolher versões do PHP (5.4 até &gt;= 8.0) </li>



<li>CronJob direto pelo painel</li>



<li>Logs de erro do PHP e do servidor</li>



<li>Migração dos seus dados gratuitamente (Consulte)</li>



<li>Hospedagem individualizada, sem compartilhamento de CPU e memória com outros sites</li>



<li>Sem fidelidade (cancele quando quiser)</li>



<li><strong>A partir de R$ 10,90</strong></li>
</ul>



<p>Lembrando que o valor de R$ 10,90 é a configuração inicial, se você precisar de mais poder de processamento, poderá efetuar upgrade da sua instância, com valores adicionais.</p>



<p><strong>Sem surpresas na conta</strong></p>



<p>Você está no controle da sua hospedagem, no painel de controle, é possível verificar uma estimativa de quantos créditos você ainda possuí e quanto tempo ele irá durar. </p>



<p>Você pode optar por deixar a recarga automática através de cartão de crédito, também é possível inserir créditos através de boleto bancário, Pix ou mercado pago.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="324" height="96" src="https://leonardonascimento.dev/wp-content/uploads/2022/11/image-1.png" alt="" class="wp-image-253" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/11/image-1.png 324w, https://leonardonascimento.dev/wp-content/uploads/2022/11/image-1-300x89.png 300w" sizes="(max-width: 324px) 100vw, 324px" /><figcaption class="wp-element-caption">Estimativa de valor e duração do crédito em dias</figcaption></figure>



<p><strong>Você no controle</strong></p>



<p>Com a <a rel="noreferrer noopener" href="https://bit.ly/3f83PxE" data-type="URL" data-id="https://bit.ly/3f83PxE" target="_blank">hostoo</a> você está no controle e não precisa ser expert em servidores, é possível efetuar upgrade e downgrade de servidor com poucos cliques e sem deixar o seu site offline. Instale e configure aplicações em poucos cliques. Gosta do WordPress? Plugin de cache gratuito para acelerar ainda mais o carregamento do seu site.</p>



<p>No print abaixo, podemos notar o domínio do site, versão do PHP, SSL ativo, detalhes do plano, detalhes de consumo de CPU, RAM, disco e outras configurações da hospedagem.</p>



<figure class="wp-block-image size-large"><a href="https://bit.ly/3f83PxE"><img fetchpriority="high" decoding="async" width="1024" height="479" src="https://leonardonascimento.dev/wp-content/uploads/2022/11/image-2-1024x479.png" alt="" class="wp-image-254" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/11/image-2-1024x479.png 1024w, https://leonardonascimento.dev/wp-content/uploads/2022/11/image-2-300x140.png 300w, https://leonardonascimento.dev/wp-content/uploads/2022/11/image-2-768x359.png 768w, https://leonardonascimento.dev/wp-content/uploads/2022/11/image-2.png 1362w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption"><a href="https://bit.ly/3f83PxE" data-type="URL" data-id="https://bit.ly/3f83PxE" target="_blank" rel="noreferrer noopener">PAINEL DE CONTROLE HOSTOO</a></figcaption></figure>



<p><strong>Precisa de mais?</strong></p>



<p>Além de ter servidores nos Estados Unidos, também é possível hospedar seus sites em clouds aqui no Brasil, claro, por um valor adicional. Com a<a rel="noreferrer noopener" href="https://bit.ly/3f83PxE" data-type="URL" data-id="https://bit.ly/3f83PxE" target="_blank"> Hostoo você pode fazer upgrade de plano facilmente</a>. Suponhamos que durante o dia, você teve visitas atípicas em seu website, resultando em um consumo máximo de CPU e RAM, e agora o que fazer? Em poucos cliques, você pode efetuar upgrade do seu plano, contratando um cloud melhor, pagando por hora utilizada, e posteriormente, retornar ao plano original, você está 100% no controle.</p>



<p><strong>Suporte que não te deixa 48h esperando</strong></p>



<p>Estou com a <a rel="noreferrer noopener" href="https://bit.ly/3f83PxE" data-type="URL" data-id="https://bit.ly/3f83PxE" target="_blank">Hostoo há mais de 1 ano</a> e diferente de outros serviços de hospedagem, o suporte é muito rápido e definitivamente resolve seus problemas. Até o momento, precisei abrir apenas 1 ticket de site fora do ar, onde ficou constatado que o problema não era na hospedagem e sim no servidor dns que eu estava utilizando como proxy, o outro ticket? Foi aberto pela própria empresa, quando me deparei com um erro 500 no painel de hospedagem. Tempo da primeira resposta &lt; 22 minutos.</p>



<figure class="wp-block-image size-large"><a href="https://bit.ly/3f83PxE" target="_blank" rel="noreferrer noopener"><img decoding="async" width="1024" height="305" src="https://leonardonascimento.dev/wp-content/uploads/2022/11/image-3-1024x305.png" alt="" class="wp-image-258" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/11/image-3-1024x305.png 1024w, https://leonardonascimento.dev/wp-content/uploads/2022/11/image-3-300x89.png 300w, https://leonardonascimento.dev/wp-content/uploads/2022/11/image-3-768x229.png 768w, https://leonardonascimento.dev/wp-content/uploads/2022/11/image-3.png 1364w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption"><a href="https://bit.ly/3f83PxE" data-type="URL" data-id="https://bit.ly/3f83PxE" target="_blank" rel="noreferrer noopener">Painel de suporte Hostoo</a></figcaption></figure>



<p>Sem dúvidas, foi um grande achado que estou compartilhando com você! <a href="https://bit.ly/3f83PxE" target="_blank" rel="noreferrer noopener">https://hostoo.io</a></p>
<p>The post <a href="https://leonardonascimento.dev/blog/hospede-seu-site-em-um-servidor-cloud-por-menos-de-r-11-mes/">Hospede seu site em um servidor Cloud por menos de R$ 11 Mês</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/hospede-seu-site-em-um-servidor-cloud-por-menos-de-r-11-mes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
