Self-hosting num mini PC com Docker + Cloudflare Tunnel
Como expor vários serviços web com segurança usando um único mini PC em casa. HTTPS via Cloudflare Tunnel sem abrir portas, e tudo rodando com Docker Compose.
Resumo
Suba os serviços com Docker Compose no mini PC e conecte domínio e HTTPS com o Cloudflare Tunnel (cloudflared), sem abrir nenhuma porta. Não precisa configurar o roteador, nem de IP fixo, nem de renovação de certificado.
Nesta página
A conta da nuvem pesa mais do que parece para projetos pequenos. Eu rodo alguns serviços, incluindo este blog, num único mini PC aqui de casa. Vou compartilhar como.
Por que um mini PC
- Fica sempre ligado, e a conta de luz é de alguns trocados por mês
- Com Docker, o ambiente de deploy é idêntico ao da nuvem
- Se o tráfego crescer, é só migrar quando chegar a hora
O problema é um só: "como expor a rede de casa para fora com segurança".
Não abra portas
O jeito tradicional é port forwarding no roteador + DDNS + renovação de certificado. É trabalhoso e perigoso, porque na prática você abre a sua rede doméstica direto para a internet.
Em vez disso, use o Cloudflare Tunnel. No mini PC, o cloudflared abre uma conexão de dentro para fora com a Cloudflare, e o tráfego entra por esse túnel. O número de portas de entrada abertas para o mundo é 0.
사용자 → Cloudflare(HTTPS) → 터널 → 미니 PC 의 컨테이너
- Não precisa de IP público nem de port forwarding
- O certificado HTTPS é gerenciado automaticamente pela Cloudflare
- IP dinâmico não faz diferença nenhuma
Agrupando serviços com Docker Compose
Cada serviço sobe como um container. Se for um app Next.js, faça o build com output: "standalone" para gerar uma imagem leve.
services:
blog:
build:
context: .
dockerfile: apps/blog/Dockerfile
container_name: why-next-blog
restart: unless-stopped
networks: [api]
networks:
api:
external: true # cloudflared 와 같은 네트워크
O ponto principal é colocar tudo na mesma rede Docker do cloudflared. É assim que o túnel encontra o serviço pelo nome do container.
Conectando o domínio
No dashboard da Cloudflare (ou na configuração do túnel), adicione um Public Hostname.
blog.example.com → http://why-next-blog:3001
E é isso. Rode docker compose up -d --build e, alguns minutos depois, o site abre no seu domínio.
Resumo
- Mini PC + Docker = deploy barato e idêntico ao da nuvem
- Cloudflare Tunnel traz HTTPS e domínio sem abrir portas
- Coloque os containers na mesma rede do cloudflared
- Mapeie
domínio → container:portacom Public Hostname
Para serviços pequenos, essa combinação aguenta por muito tempo. É assim que eu rodo vários apps e vou expandindo as coisas que eu criei.
Perguntas frequentes
Meu IP residencial é dinâmico, tem problema?
Nenhum problema. No Cloudflare Tunnel é o mini PC que abre a conexão de saída para a Cloudflare, então IP público, port forwarding e DDNS são totalmente desnecessários.
Tem algum custo?
O Cloudflare Tunnel em si é gratuito. Só com o custo do domínio você já consegue começar.
Artigos relacionados
- 💻 Dev
Quando um bucket tem dois donos, ganha quem fez apply por último
Adicionei uma regra de lifecycle no S3 e o terraform apply falhou. A causa: duas resources eram donas, cada uma por conta própria, da configuração de lifecycle do mesmo bucket. O lifecycle do S3 não funciona por regra, e sim por documento inteiro, então o último vencedor apaga em silêncio as regras do outro.
- 💻 Dev
Os testes estavam verdes, mas nenhuma notificação tinha sido enviada
O código que enfileirava os jobs falhava sempre, desde o primeiro dia. O erro era engolido, e os testes seguiam verdes graças aos mocks. A história de como um único caractere de dois-pontos matou três funcionalidades em silêncio.
- 💻 Dev
Chegou um alerta dizendo que o banco tinha caído. O banco nunca caiu
Em um único dia acumularam-se quatro alertas CRITICAL. 504, P2028 do Prisma, 500 no admin e 'serviço DATABASE fora do ar'. Abri primeiro as métricas do RDS: durante 21 horas seguidas, a CPU não passou de 19,7%. O lento não era o banco, eram as idas e voltas atravessando o Atlântico vinte e cinco vezes - e o alerta de 'fora do ar' foi o próprio health check que o fabricou.