Todo app novo que eu subo no meu homelab pessoal acaba pedindo a mesma coisa: um banco de dados, às vezes uma fila, de preferência já provisionados antes do primeiro docker compose up. Quando rodei o litellm, precisei de Postgres. O Infisical quis Postgres e Redis. Outros projetos pediram RabbitMQ ou MongoDB. O padrão preguiçoso é cada projeto subir seu próprio Postgres + Redis no compose dele, e aí, três projetos depois, você tem três Postgres, dois Redis, conflito de porta toda hora, zero isolamento de verdade e backup espalhado em pasta que ninguém lembra.

Como eu melhorei a organização dos meus Apps no Homelab pessoal

A Solução: Infra-Shelf

Foi pra matar essa dor que escrevi o Infra-Shelf, hoje aberto no GitHub: https://github.com/IvanMicai/infra-shelf.

Uma Prateleira Compartilhada

Em vez de cada app trazer seu próprio banco, eu rodo uma instância de cada coisa numa rede Docker privada (Infra-Shelf), e cada aplicativo ganha uma credencial isolada dentro dela. Nada de entregar o superusuário pra um app qualquer.

Separação por Aplicativo

A separação por aplicativo acontece dentro de cada serviço:

  • Postgres, Redis, RabbitMQ e MongoDB sobem com um make up. S3 e SignOz são overlays opcionais. Tudo na mesma rede, então seus apps conectam por nome de host (postgres, redis.) sem expor porta pra fora.

O Coração: o Binário Go único, o shelf

O coração é um binário Go único, o shelf. Provisionar um app é uma linha:

  • Ele gera uma senha aleatória por serviço, roda os comandos de admin dentro dos containers (psql, redis-cli, rabbitmqctl, mongosh), grava tudo num registry e cospe um bloco .env pronto pra colar no projeto:
  • A partir daí o dia a dia é só mais alguns comandos:
  • Tem também uma UI web (shelf-web), e o detalhe importante é que ela não chama o CLI por baixo: as duas pontas importam a mesma biblioteca Go (internal/shelfcore) e chamam as mesmas funções. CLI e web fazem exatamente a mesma coisa, sem parsing de stdout no meio.
  • Quando eu não tô a fim de terminal, a UI web faz o mesmo provisionamento por formulário. A tela /apps tem o campo do nome do app (padrão [a-z][a-z0-9-]*), um campo opcional de environments (pra expandir em staging/production), checkboxes dos serviços e um botão Provision. Provisionado, dá pra revelar as credenciais e baixar o .env direto pela interface.
  • Roda em http://127.0.0.1:8080 com Basic Auth, é HTML renderizado no servidor (sem framework de frontend, SQLite puro-Go por baixo) e é o jeito que eu mais uso quando vou criar um app novo no fim de semana.

Backup e Segurança

Consolidar tudo numa prateleira só também consolida o backup: é uma estratégia em vez de seis pastas perdidas.

  • Cada serviço é salvo do jeito certo pra ele.
  • Dá pra agendar com retenção, que é como eu deixo rodando:
  • Backup diário às 3h, guardando 14 dias. Em caso de catástrofe, pool que corrompe, volume que some, eu tenho de onde voltar. O registry com os secrets ainda pode ser cifrado em repouso (AES-256-GCM, via INFRA_SHELF_SECRET), então o arquivo de credenciais não fica em texto puro no disco.

Conclusão

A pergunta óbvia ao consolidar é se juntar tudo numa instância não piora as coisas. E aqui preciso ser honesto, porque a primeira versão deste post exagerou: economia de memória não é o motivo pra usar o Infra-Shelf.

  • O ganho de memória só aparece num caso específico: quando a alternativa seria um container de banco completo por projeto, cada um com seu próprio postmaster, shared memory e workers. É esse overhead fixo, pago N vezes, que some ao juntar tudo. Num relato de homelab colapsando seis containers Postgres separados em um, a RAM caiu de ~3.2 GB pra ~1.8 GB (DiyMediaServer), real, mas modesto, e mesmo assim não é o ponto.
  • O ponto, no meu caso, é operacional: meu homelab não roda o mesmo banco várias vezes pro mesmo app, ele roda apps diferentes: uns com Postgres, outros com Mongo, outros só com fila. O que eu queria não era espremer MB, era parar de manter um stack de banco por projeto.**

Todos os apps ficam presos na mesma major version de cada banco. Quer um projeto no Postgres 16 e outro no 18? Aí o container dedicado ganha um pouco mais de RAM, mas isso é um custo honesto que eu devia ter destacado desde o começo.**

O Infra-Shelf é uma solução que permite gerenciar bancos de dados e outros serviços de forma mais eficiente em um homelab, reduzindo conflitos e otimizando a organização de aplicativos.**

OrganizacaoHomelabMelhoreiMeusPessoal