Noite. Uma ideia simples para um micro-SaaS e um querer de colocar um MVP no ar. Abre o terminal, empolgado.
Duas horas depois, a empolgação vira frustração. Não estava codando o produto; estava brigando com um arquivo docker-compose.yml de 50 linhas, tentando lembrar a sintaxe correta do traefik.labels, depurando porque o container do Nginx não "enxergava" o backend na rede interna e renovando certificados SSL que falharam silenciosamente.
Eu percebi que passo mais tempo configurando infraestrutura para projetos pequenos do que realmente construindo eles.
Foi aí que decidi parar de configurar e começar a declarar minha intenção.
Apresentando o OI (Orquestrador de Intenção)
O OI é uma ferramenta CLI open-source que desenvolvi em Go para eliminar a complexidade do "como fazer" e focar apenas no "o que eu quero".
A filosofia é: Implantação por meio de intenção, não de configuração.
Ao invés de gerenciar Dockerfiles, redes, volumes e proxies manualmente, eu apenas digo ao OI o que eu quero, e ele faz a "mágica" acontecer.
Como instalar (em 10 segundos)
Se você estiver no Linux (x86 ou ARM64), pode instalar com um único comando. Criei um script que detecta sua arquitetura e baixa o binário correto:
curl -sSL https://raw.githubusercontent.com/MrJc01/crom-oi/main/scripts/install.sh | sudo bash
**
Pronto. O comando oi já deve estar disponível no seu terminal.
Como funciona na prática?
Esqueça o YAML gigante. Você cria um arquivo oi.json com sua intenção clara:
{
"nome": "meu-app",
"origem": "docker.io/library/nginx:alpine",
"dominio": "meu-app.localhost",
"porta": 80,
"recursos": {
"cpu": "0.5",
"memoria": "128mb"
}
}
E roda:
oi up
O OI lê esse arquivo e garante que a realidade do servidor corresponda exatamente a essa intenção.
O que acontece "debaixo do capô"? (A parte técnica)
O oi não é um shell script glorificado. Ele é uma aplicação robusta em Go que interage diretamente com o Docker SDK e a API do Caddy. Eis o fluxo que implementei (está no internal/core/service/orchestrator.go):
- Fail-Fast Validation: Antes de tocar em qualquer container, ele valida DNS e conectividade.
- Blue-Green Deployment (Nativo):
- Ele sobe um novo container (Green).
- Aguarda o Health Check passar (implementei uma espera ativa).
- Se passar, ele reconfigura o Caddy (via API) para apontar o tráfego para o novo container.
- Só então ele remove o container antigo (Blue) com graceful shutdown.
- Resultado: Zero downtime real.
- Gestão de Proxy: Ele fala diretamente com a API administrativa do Caddy (
:2019) para criar rotas de proxy reverso dinamicamente. - Isolamento de Rede: Cada projeto ganha sua própria rede bridge isolada automaticamente.
- Bilíngue: O parser JSON aceita chaves em Português (memoria) ou Inglês (memory), porque... por que não?
Onde estou "travado" (Pedido de Ajuda)
O projeto está funcional. Consigo fazer deploys, rollbacks automáticos, ver logs (oi logs -f) e monitorar o status. Mas, como todo projeto solo, cheguei num ponto de indecisão sobre o futuro da arquitetura e gostaria da visão de vocês:
- Estado: Hoje o "estado" é o que está rodando no Docker. Se eu reiniciar o servidor, o Docker sobe os containers, mas estou pensando se deveria implementar um banco KV local (tipo BoltDB) para persistir a "intenção" de forma mais rígida. É exagero para uma CLI?
- Build vs. Deploy: Hoje ele puxa imagens prontas (
origem). Vocês acham que uma ferramenta assim deveria também buildar a imagem (oi build) ou isso fere o princípio de responsabilidade única? - Abstração do Proxy: A integração é forte com o Caddy. Deveria gastar energia abstraindo para suportar Nginx/Traefik ou focar em fazer a integração com Caddy ser impecável?
- Ele resolveu minha dor até agora, não sei se realmente quero implementar novas funcionalidades, mas gostaria de saber como melhorar.
Código e Link
O projeto é 100% open-source. Se você curte Go, Docker ou apenas quer uma ferramenta simples para seus side-projects, dá uma olhada:
🔗 Repositório: https://github.com/MrJc01/crom-oi
Qualquer feedback — seja sobre o código em Go, a usabilidade ou a ideia em si — é muito bem-vindo nos comentários!
☕ Apoie o Desenvolvimento open-source do seu país(Não falo só de mim aqui)
Manter o desenvolvimento de ferramentas open-source exige tempo, dedicação e, claro, muito ☕ para alguns, e muito 🍀 para outros. Se você gostou da filosofia do OI, achou a ferramenta útil ou simplesmente quer incentivar a continuidade do projeto, qualquer apoio é bem-vindo.
Estou trabalhando em um módulo de doações dedicado na Crom (a organização por trás do projeto), mas enquanto ele não fica pronto, estou aceitando apoios via PIX:
Chave:
mrj.crom@gmail.com
⚠️ Importante: Se você fizer uma doação, por favor, envie o comprovante com uma mensagem (pode ser só seu usuário do GitHub ou TabNews) para o e-mail: mrj.crom@gmail.com
Assim que eu finalizar e lançar a implementação oficial de donate/invest da Crom, farei questão de migrar e disponibilizar esses apoios lá como créditos, badges de apoiadores, ou minimamente agradecimentos pelo valor investido.
Muito obrigado pela sua atenção! 🗿🍷