<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:webfeeds="http://webfeeds.org/rss/1.0"><channel><title>caddy | Self-Hosted!</title><link>https://blog.brumarino.com/tags/caddy/</link><description>Post novo no “Rack” todo dia às 7AM. Proxmox, rede, backup, UPS, IA e tudo o que tenho estudado.</description><language>pt-BR</language><managingEditor>Bruno Marino</managingEditor><image><url>https://blog.brumarino.com/brand/icon-144.png</url><title>caddy | Self-Hosted!</title><link>https://blog.brumarino.com/tags/caddy/</link><width>144</width><height>144</height></image><webfeeds:icon>https://blog.brumarino.com/brand/icon-192.png</webfeeds:icon><webfeeds:logo>https://blog.brumarino.com/brand/symbol.svg</webfeeds:logo><webfeeds:accentColor>2B3036</webfeeds:accentColor><lastBuildDate>Sat, 31 Oct 2026 07:00:00 -0300</lastBuildDate><atom:link href="https://blog.brumarino.com/tags/caddy/index.xml" rel="self" type="application/rss+xml"/><item><title>Proxy reverso no homelab: Caddy, NPM ou Traefik</title><link>https://blog.brumarino.com/proxy-reverso-caddy-npm-traefik/</link><pubDate>Sat, 31 Oct 2026 07:00:00 -0300</pubDate><guid>https://blog.brumarino.com/proxy-reverso-caddy-npm-traefik/</guid><category>Rede e acesso</category><description>Caddy, Nginx Proxy Manager ou Traefik como proxy reverso no homelab: HTTPS, configuração e cuidados de cada um, e onde entra o Cloudflare Tunnel.</description><content:encoded><![CDATA[<p>Quando o homelab passa de dois ou três serviços, decorar <code>192.168.1.30:8080</code> vira um problema. Proxy reverso é o que resolve isso: um ponto de entrada que recebe o pedido por nome, cuida do HTTPS e encaminha para o serviço certo.</p>
<p>Os três nomes que mais aparecem são <strong>Caddy</strong>, <strong>Nginx Proxy Manager</strong> e <strong>Traefik</strong>. Neste post comparo os três pelo que as documentações oficiais dizem, com o que eu olharia para escolher. Este blog, por exemplo, é servido por um Caddy num container LXC.</p>
<h2 id="o-que-um-proxy-reverso-faz">O que um proxy reverso faz <a class="anchor" href="#o-que-um-proxy-reverso-faz" aria-label="Link para esta seção">#</a></h2>
<p>Em vez de cada serviço ter a sua porta exposta, todos ficam atrás do proxy:</p>
<ul>
<li><code>vault.casa.seudominio.com</code> vai para o Vaultwarden;</li>
<li><code>fotos.casa.seudominio.com</code> vai para o app de fotos;</li>
<li>e assim por diante.</li>
</ul>
<p>O proxy cuida de três coisas:</p>
<ol>
<li><strong>Roteamento por nome:</strong> um IP só, vários serviços.</li>
<li><strong>HTTPS:</strong> obtém e renova os certificados, num lugar só.</li>
<li><strong>Controle:</strong> cabeçalhos, limites e, em alguns, login antes de chegar ao serviço.</li>
</ol>
<p>O HTTPS não é detalhe. Alguns apps nem funcionam sem ele, como o cofre web do Vaultwarden, que contei no post sobre o <a href="/vaultwarden-familia-homelab/">Vaultwarden para a família</a>.</p>
<h2 id="e-o-cloudflare-tunnel">E o Cloudflare Tunnel? <a class="anchor" href="#e-o-cloudflare-tunnel" aria-label="Link para esta seção">#</a></h2>
<p>No meu homelab, o que sai para a internet passa pelo <strong>Cloudflare Tunnel</strong>, que já entrega HTTPS e não exige porta aberta no roteador. Contei como ele resolveu os bots no SSH no post sobre <a href="/ssh-cloudflare-tunnel-proxyjump/">SSH sem porta 22 aberta</a>.</p>
<p>O tunnel e o proxy reverso não brigam. O tunnel cuida da entrada de fora. O proxy faz sentido para <strong>acesso dentro de casa</strong> com nomes e HTTPS, ou para juntar vários serviços atrás de um destino só do tunnel. Se você só acessa de fora e tudo passa pelo tunnel, talvez nem precise de proxy.</p>
<h2 id="caddy-https-sem-pensar">Caddy: HTTPS sem pensar <a class="anchor" href="#caddy-https-sem-pensar" aria-label="Link para esta seção">#</a></h2>
<p>O Caddy é um servidor web com proxy reverso embutido. A característica dele, pela documentação, é o <strong>HTTPS automático</strong>: por padrão, ele serve todo site por HTTPS, obtém e renova os certificados e redireciona HTTP para HTTPS.</p>
<p>A configuração de um proxy cabe em três linhas:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-caddyfile" data-lang="caddyfile"><span class="line"><span class="cl"><span class="gh">vault.casa.seudominio.com</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">reverse_proxy</span> <span class="n">192.168.1.30</span><span class="p">:</span><span class="mi">80</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Detalhes da documentação que importam no homelab:</p>
<ul>
<li>para um domínio público com o desafio padrão, o DNS precisa apontar para o servidor e as <strong>portas 80 e 443</strong> precisam estar acessíveis de fora;</li>
<li>sem porta aberta, o caminho é o <strong>desafio por DNS</strong>, que precisa das credenciais do seu provedor de DNS e de um <strong>plugin</strong> específico, já que o suporte a provedores é feito pela comunidade;</li>
<li>para nomes locais e IPs, o Caddy cria a <strong>própria autoridade certificadora</strong> e assina os certificados com ela.</li>
</ul>
<p>Bom para quem gosta de arquivo de texto, versionado no git, e quer o mínimo de configuração.</p>
<h2 id="nginx-proxy-manager-tudo-pela-interface">Nginx Proxy Manager: tudo pela interface <a class="anchor" href="#nginx-proxy-manager-tudo-pela-interface" aria-label="Link para esta seção">#</a></h2>
<p>O Nginx Proxy Manager (NPM) é uma interface web em cima do Nginx, distribuída como imagem Docker. Pela documentação, ele traz:</p>
<ul>
<li>certificados <strong>Let&rsquo;s Encrypt</strong> grátis, ou os seus;</li>
<li><strong>listas de acesso</strong> e autenticação HTTP básica por host;</li>
<li>configuração avançada do Nginx para quem precisar;</li>
<li>usuários, permissões e registro de auditoria.</li>
</ul>
<p>A instalação é um Docker Compose com três portas: 80 (HTTP), 443 (HTTPS) e <strong>81, a interface de administração</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">app</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;jc21/nginx-proxy-manager:2.16.0&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s1">&#39;80:80&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s1">&#39;81:81&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s1">&#39;443:443&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./data:/data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">./letsencrypt:/etc/letsencrypt</span><span class="w">
</span></span></span></code></pre></div><aside class="alert alert--warning">
  <p class="alert__title">Atenção</p>
  <p>A porta 81 é o painel que controla todo o seu tráfego. Não publique essa porta na internet e use senha forte no primeiro acesso.</p>
</aside><p>Bom para quem prefere clicar a editar arquivo, e para quem já usa Docker.</p>
<h2 id="traefik-configuração-pelos-containers">Traefik: configuração pelos containers <a class="anchor" href="#traefik-configura%c3%a7%c3%a3o-pelos-containers" aria-label="Link para esta seção">#</a></h2>
<p>O Traefik foi feito para ambientes com containers. Com o provedor Docker, ele <strong>lê os rótulos (labels) dos containers</strong> e monta as rotas sozinho. Subiu um container com o rótulo certo, a rota existe:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="l">traefik.http.routers.meu-app.rule=Host(`app.casa.seudominio.com`)</span><span class="w">
</span></span></span></code></pre></div><p>Dois cuidados da documentação:</p>
<ul>
<li>a opção <code>exposedByDefault</code> vem <strong>ligada</strong> (<code>true</code>): todo container é exposto, a menos que você desligue e marque só os que quer;</li>
<li>o Traefik precisa acessar a API do Docker, e a documentação avisa que dar esse acesso sem restrição é um risco: se o Traefik for atacado, o atacante pode chegar ao host.</li>
</ul>
<p>Bom para quem roda muitos containers Docker e quer que as rotas acompanhem o ciclo de vida deles. Num homelab que é quase todo LXC, como o meu, ele perde a principal vantagem.</p>
<h2 id="lado-a-lado">Lado a lado <a class="anchor" href="#lado-a-lado" aria-label="Link para esta seção">#</a></h2>
<table>
	<thead>
			<tr>
					<th></th>
					<th>Caddy</th>
					<th>Nginx Proxy Manager</th>
					<th>Traefik</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Configuração</td>
					<td>Arquivo (Caddyfile)</td>
					<td>Interface web</td>
					<td>Rótulos nos containers e arquivo</td>
			</tr>
			<tr>
					<td>HTTPS automático</td>
					<td>Sim, padrão</td>
					<td>Sim, por host</td>
					<td>Sim, configurando</td>
			</tr>
			<tr>
					<td>Melhor com</td>
					<td>Qualquer coisa</td>
					<td>Docker</td>
					<td>Docker com muitos containers</td>
			</tr>
			<tr>
					<td>Versiona no git</td>
					<td>Fácil</td>
					<td>Difícil (fica no banco)</td>
					<td>Fácil</td>
			</tr>
			<tr>
					<td>Curva de aprendizado</td>
					<td>Baixa</td>
					<td>Baixa</td>
					<td>Maior</td>
			</tr>
	</tbody>
</table>
<h2 id="qual-eu-escolheria">Qual eu escolheria <a class="anchor" href="#qual-eu-escolheria" aria-label="Link para esta seção">#</a></h2>
<ul>
<li><strong>Começando, com poucos serviços e LXC:</strong> Caddy. Um arquivo, três linhas por serviço, HTTPS sozinho.</li>
<li><strong>Prefere interface e já usa Docker:</strong> Nginx Proxy Manager.</li>
<li><strong>Muitos containers Docker que mudam toda hora:</strong> Traefik.</li>
</ul>
<aside class="alert alert--tip">
  <p class="alert__title">Dica</p>
  <p>Qualquer que seja a escolha, coloque o proxy num container próprio e inclua no backup da noite. Se ele cai, todos os serviços atrás dele ficam inacessíveis pelo nome. Um container restaurado do vzdump resolve, como mostro no post sobre <a href="/backup-proxmox-vzdump/">backup com vzdump</a>.</p>
</aside><h2 id="resumindo">Resumindo <a class="anchor" href="#resumindo" aria-label="Link para esta seção">#</a></h2>
<ul>
<li><strong>Proxy reverso</strong> dá nomes e HTTPS aos serviços, num ponto de entrada só.</li>
<li><strong>Cloudflare Tunnel</strong> cuida da entrada de fora. O proxy ajuda dentro de casa.</li>
<li><strong>Caddy:</strong> HTTPS automático e configuração mínima em arquivo.</li>
<li><strong>Nginx Proxy Manager:</strong> tudo pela interface, em Docker. Proteja a porta 81.</li>
<li><strong>Traefik:</strong> rotas pelos rótulos dos containers. Cuidado com o acesso à API do Docker.</li>
</ul>
<p>O melhor proxy é aquele cuja configuração você consegue entender daqui a seis meses. Num homelab pequeno, um arquivo de texto no git costuma ganhar essa disputa.</p>
]]></content:encoded></item></channel></rss>