RAFAEL REIS case study
llmops · self-hosted

12 anos de homelab: meu stack de IA self-hosted

TL;DR

Stack: Proxmox · ZFS · RTX 3090 (GPU passthrough) · llama.cpp · Qwen · pgvector · Tailscale · Cloudflare Tunnel · Grafana · Borg

O lab que virou método

Chamar isto de "homelab" é tecnicamente correto da mesma forma que chamar um Boeing de "veículo". A base: hypervisor Proxmox num servidor dual-Xeon (48 threads, 160 GB de RAM ECC), storage ZFS, duas GPUs em passthrough — uma para mídia, uma dedicada a inferência de LLM — e 40+ serviços em 3 ambientes: o host local, uma VPS ARM na nuvem e containers LXC. Tudo deployado do git, pelo mesmo padrão GitOps que roda o SaaS da minha empresa — foi aqui que o padrão foi provado primeiro.

Um número que eu acho mais revelador que os 40+ ativos: o diretório de stacks descomissionados tem o dobro disso. SSO providers, quatro gerações de stack de monitoramento, orquestradores — testados a sério, comparados, e aposentados com nota. Homelab bom não é o que acumula serviço: é o que avalia e mata serviço.

E é uso de verdade, diário: sincronizações a cada 15 minutos, jobs noturnos de síntese, um briefing matinal automatizado em dias úteis, backups diários. O lab não é uma vitrine — é infraestrutura da qual eu dependo.

Rede: a resposta pra "qual porta você abriu?" é nenhuma

Nada de port-forward no roteador. A exposição pública sai por Cloudflare Tunnel, com roteamento declarado por labels nos próprios containers — subir um serviço já o publica, com política de acesso (SSO) na frente dos painéis administrativos. O tráfego interno anda numa mesh Tailscale (zero-trust, identidade por nó). Na borda física, um firewall OPNsense com WAN dupla e failover automático.

O efeito prático: a superfície de ataque de fora é a de quem não tem nada em casa — e por dentro, cada acesso tem identidade.

a rede, de dentro pra fora
internet Cloudflare Tunnel SSO nos painéis HOMELAB 40+ serviços publicação por label no próprio container conexão sai de dentro meus dispositivos mesh Tailscale · identidade por nó 0 portas abertas no roteador
a superfície externa é a de quem não tem nada em casa · a seta aponta pra fora de propósito

O stack de IA

Inferência: 24 GB de VRAM são a moeda

Uma VM dedicada recebe a RTX 3090 por GPU passthrough e roda llama.cpp com um orquestrador de modelos na frente — um "scheduler de VRAM" que carrega e descarrega modelos por demanda, com regras de custo de eviction baseadas em uso real medido (nos meus logs, requests de embedding superam chat em mais de 20:1 — então o modelo de embeddings nunca é despejado; fica quente 24/7).

O catálogo diário: um modelo de embeddings e um reranker residentes, mais um Qwen MoE de ~35B parâmetros quantizado com 128K de contexto e KV cache quantizado — tudo isso convivendo em ~20 dos 24 GB. Para trabalho pesado, modelos maiores com 256K de contexto (um deles com visão) tomam a placa inteira, a 23,7 de 24 GB. Isso é LLMOps na prática: quantização como trade-off consciente, orçamento de VRAM como capacity planning, e orquestração como scheduling — as mesmas disciplinas de infra, numa moeda nova.

o scheduler de VRAM, em replay
VRAM: 20,4 / 24 GB
qwen 35B · 128K de contexto 27B com visão · 23,7 GB · placa inteira 0 12 GB 24 GB
boot · bge-m3 (embeddings) residente 24/7 · 1,2 GB
load reranker · 0,9 GB
chat · load qwen 35B 128K quantizado · 18 GB
job com visão · evict do daily set · load 27B · 23,7 GB
fim do job · restore do daily set · 20,4 / 24 GB
sequência real do scheduler · eviction guiada por uso medido: embeddings superam chat em 20:1, então nunca são despejados

Otimização com número: mover o pipeline de embeddings de CPU para GPU derrubou o processamento de um documento grande de ~38 s para ~4,6 s.

RAG e o knowledge-graph pessoal

Em cima da inferência, um knowledge-graph pessoal: 2.500+ páginas, milhares de links e entradas de timeline, com busca híbrida — vetores (pgvector) + full-text em português — e 100% do corpus embedado localmente. Toda noite, um job de síntese cruza o grafo e escreve reflexões conectando o que entrou no dia.

Esse job noturno é a melhor história de custo do case: ele rodou primeiro em APIs de nuvem — e batia em rate limit, custava centavos por rodada, todo dia. Migrei a síntese inteira para a GPU local: de custo por chamada para custo marginal de eletricidade, sem rate limit, com dados que nunca saem de casa. Cloud pra fronteira, local pra volume recorrente — saber qual é qual é o trabalho.

Agentes: o homelab audita a empresa

O andar de cima do stack são agent runtimes: um gateway de agentes com ferramentas e memória, e — o meu favorito — um agente autônomo de pentest (open-source, orquestrado por workflow engine) que roda contra o código do meu próprio SaaS, usando o LLM local como cérebro. O laboratório de casa fazendo red-team contínuo da empresa, a custo de eletricidade. Um dos achados dele virou postmortem e patch enviado upstream.

Operado como produção (senão é só um monte de container)

40+serviços ativos
3ambientes
2 anosde retenção de métricas
15+postmortems escritos

Por que self-hostar IA (e o que isso me ensinou)

Outros cases

Migrando 50+ tenants em produção entre data centers, com zero downtime Réplica quente, cutover atômico, e prova por captura de pacotes — não por otimismo. Um time de plataforma de uma pessoa só 60+ tenants, dois data centers, um engenheiro — por arquitetura, não heroísmo.

Sempre aberto a trocar ideia com quem opera infraestrutura de verdade.

LinkedIn