Implements three UX improvements (TODO #1–#3): - Back navigation: Esc returns to the previous input step. The Model keeps a history stack of input steps (advance/goBack helpers); action/wait steps are excluded via isInputStep so back never re-enters a side-effecting step. Form values are preserved. - Review step (StepReview): shows all collected config for confirmation before any file is written; Enter installs, Esc edits. - Retry vs. fix: transient failures (image pull, container run) offer "r: tentar novamente" instead of quitting; validation failures route back to the relevant form to correct the value. Adds nav_test.go for the history/navigation logic and updates README/CLAUDE/docs (incl. docs/TODO.md tracking the remaining ideas). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
8.9 KiB
App do Dono — Instalador Cliente (TUI)
Instalador de terminal (TUI) que faz, em poucos passos guiados, a configuração e o provisionamento do middleware cliente do "App do Dono". Esse middleware roda na infraestrutura do tenant (cliente) e é responsável por intermediar a comunicação entre os servidores do tenant e o servidor central da davinTI.
A ferramenta cuida de tudo de ponta a ponta: valida o Docker, autentica no registry
privado, baixa as imagens, coleta as configurações via formulários no terminal, gera
os arquivos de configuração (config.toml e envs) e sobe os containers necessários.
Construído com Bubble Tea, Bubbles e Lip Gloss (linha Charm v2).
Sumário
O que ele faz
O instalador conduz o operador por um assistente (wizard) no terminal que:
- Verifica o Docker na máquina (encerra com instruções se não houver).
- Autentica no registry Docker privado (
hub.davinti.com.br). - Baixa a imagem do app cliente (
app-dono/app-cliente). - Pergunta se a máquina possui IP público:
- Sim → segue direto para a configuração da aplicação.
- Não → configura o túnel vproxy (WireGuard) e sobe esse container antes.
- Coleta, via formulários, as configurações de aplicação, servidor, banco de dados e certificados.
- Gera o
config.tomle sobe o containerapp-dono-cliente. - Exibe a confirmação de sucesso.
Pré-requisitos
- Docker instalado e em execução na máquina de destino.
- O instalador não instala o Docker automaticamente — se não encontrar, ele orienta a instalação manual e encerra.
- Credenciais do registry privado
hub.davinti.com.br. - Token de inscrição (enrollment token) gerado no painel web do App do Dono.
- Quando não houver IP público: dados do túnel vproxy (chave privada, IP virtual, pre-shared key e mapeamento de proxy).
- Diretório local com os certificados mTLS do cliente (
client.crt,client.key,ca.crt).
Como usar
Baixe o binário pré-compilado correspondente ao seu sistema operacional (distribuído via S3 — veja o time de infraestrutura) e execute:
chmod +x installer-linux-amd64
./installer-linux-amd64
Ou rode direto a partir do código-fonte:
go run ./cmd
Navegação na interface
| Tecla | Ação |
|---|---|
Tab / ↓ |
Próximo campo |
Shift+Tab / ↑ |
Campo anterior |
← / → |
Alternar opção (campos de seleção) |
Enter |
Confirmar campo / avançar etapa |
Esc |
Voltar à etapa anterior |
r |
Tentar novamente (em telas de erro) |
| Qualquer tecla | Avançar em telas de status |
Ctrl+C |
Sair a qualquer momento |
Fluxo de instalação
┌──────────────────┐
│ Verifica Docker │ ──── não instalado ──► orienta instalação e encerra
└────────┬─────────┘
│ instalado
▼
┌──────────────────┐
│ Login Registry │
└────────┬─────────┘
▼
┌──────────────────┐
│ Baixa imagem │ (app-cliente)
│ app-cliente │
└────────┬─────────┘
▼
┌──────────────────┐
│ Tem IP público? │
└───┬──────────┬───┘
│ Sim │ Não
│ ▼
│ ┌──────────────────┐
│ │ Config. vproxy │ → gera "envs" → baixa imagem vproxy → sobe container vproxy
│ └────────┬─────────┘
│ │
▼ ▼
┌─────────────────────────────────────────┐
│ Config. Aplicação → Servidor → │
│ Banco de Dados → Certificados │
└────────────────────┬────────────────────┘
▼
┌──────────────────┐
│ Revisão (Review) │ ← esc volta para editar
└────────┬─────────┘
▼
┌──────────────────┐
│ Gera config.toml │
└────────┬─────────┘
▼
┌──────────────────┐
│ Sobe container │ (app-dono-cliente)
│ app-dono-cliente │
└────────┬─────────┘
▼
✅ Concluído
Conectividade: IP público vs. vproxy
O middleware cliente precisa se comunicar com o servidor central. A forma de conectividade depende da infraestrutura do tenant:
- Com IP público: a comunicação é direta; o passo do vproxy é pulado.
- Sem IP público: sobe-se o container vproxy (túnel WireGuard, imagem
davinti-vproxy), que estabelece o túnel de saída e expõe os serviços necessários através doPROXY_EDPS. O protocolo padrão é UDP (melhor desempenho); caso firewalls restritivos bloqueiem UDP, é possível selecionar TCP.
Arquivos gerados
O instalador gera dois arquivos no diretório de execução:
config.toml— configuração do app cliente (servidor, banco, certificados, aplicação, log). É montado dentro do container em/app/config.toml.envs— variáveis de ambiente do vproxy/WireGuard (gerado somente quando não há IP público). É passado ao container via--env-file.
Ambos os arquivos são reaproveitados como valores padrão caso já existam ao reabrir
o instalador (no caso do config.toml).
Containers e rede Docker
Todos os containers são conectados à rede Docker app-dono_app (criada
automaticamente se não existir).
| Container | Imagem | Quando sobe |
|---|---|---|
app-dono-cliente |
hub.davinti.com.br:443/app-dono/app-cliente |
Sempre |
vproxy |
hub.davinti.com.br:443/davinti-vproxy |
Quando não há IP púb. |
Características:
- Ambos sobem com
--restart unless-stopped. - O container do app expõe a porta configurada no host, mapeando para a
8080interna, e monta oconfig.tomle o diretório de certificados como volumes. - O
vproxyroda com--cap-add=NET_ADMINe acesso a/dev/net/tun. - O modo compatibilidade (
seccomp=unconfined) pode ser ativado para máquinas antigas onde o seccomp padrão causa problemas.
Build a partir do código
Requer Go 1.25+. O Makefile gera binários estáticos para múltiplas plataformas:
make build # compila para linux/darwin/windows (amd64/arm64) em ./dist
make build VERSION=2.0.0 # define a versão
make clean # remove ./dist
# Publicação no S3 (requer S3_BUCKET):
make push S3_BUCKET=meu-bucket VERSION=1.0.0
make release S3_BUCKET=meu-bucket VERSION=2.0.0
make help # lista variáveis e alvos
Para um build local rápido:
go build -o installer ./cmd
./installer
Documentação adicional
- docs/fluxo.md — detalhamento de cada etapa do assistente.
- docs/configuracao.md — referência de todos os campos de configuração e dos arquivos gerados.
- docs/arquitetura.md — visão da arquitetura interna do código (modelo Bubble Tea, comandos, etapas).