Files
tuio/docs/fluxo.md
T
jbandClaude Opus 4.8 255b4cc299 feat: add back navigation, review step, and error retry to TUI
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>
2026-06-19 12:19:49 -03:00

6.5 KiB
Raw Permalink Blame History

Fluxo do Instalador

Este documento detalha cada etapa do assistente, a ordem em que ocorrem e as ações executadas em segundo plano. As etapas são definidas em internal/tui/steps.go.

Visão geral das etapas

# Etapa (step) O que acontece
1 StepCheckDocker Verifica se o binário docker está no PATH.
2 StepDockerInstall Tela final exibida quando o Docker não é encontrado.
3 StepDockerLogin Formulário de login no registry privado.
4 StepDownloadImage docker login + docker pull da imagem do app cliente.
5 StepIPQuestion Pergunta se há IP público disponível.
6 StepWireguardConfig Formulário de configuração do vproxy (apenas sem IP público).
7 StepGenerateWireguardFile Gera o arquivo envs.
8 StepDownloadWireguard docker login + docker pull da imagem do vproxy.
9 StepRunWireguard Sobe o container vproxy.
10 StepAppConfig Formulário da aplicação (URL central, token).
11 StepServerConfig Formulário do servidor (porta, timeout, ambiente, compatibilidade).
12 StepDatabaseConfig Formulário do banco de dados.
13 StepCertConfig Formulário do diretório de certificados.
14 StepReview Revisão de todas as configurações antes de instalar.
15 StepGenerateFile Gera o config.toml.
16 StepRunDocker Sobe o container app-dono-cliente.
17 StepDone Mensagem de sucesso.

Navegação e tratamento de erros

  • Voltar (Esc): retorna à etapa de entrada anterior (formulários, pergunta de IP e revisão). O Model mantém uma pilha history de etapas; etapas de ação (downloads, geração de arquivo, subida de container) ficam de fora e não são reexecutadas ao voltar. Os valores já digitados nos formulários são preservados.
  • Revisão (StepReview): antes de gravar qualquer arquivo, todas as configurações coletadas são exibidas para confirmação. Enter confirma e gera o config.toml; Esc volta ao formulário anterior para editar.
  • Tentar novamente: falhas transitórias (download de imagem, subida de container) oferecem r para reexecutar apenas aquele passo (q sai). Erros de validação (geração de arquivo) levam de volta ao formulário correspondente para correção.

Detalhamento

1. Verificação do Docker (StepCheckDocker)

Ao iniciar, o Init() dispara três comandos em paralelo: CheckDockerCmd, TickCmd (anima a barra de progresso) e o tick do spinner. O CheckDockerCmd executa exec.LookPath("docker").

  • Encontrado: ao pressionar qualquer tecla, segue para o login.
  • Não encontrado: vai para StepDockerInstall, que orienta a instalação manual e encerra. O instalador não instala o Docker.

3–4. Login e download da imagem do app

O formulário coleta usuário e senha do registry. Em seguida, DownloadImageCmd executa:

docker login hub.davinti.com.br:443/app-dono/app-cliente:latest -u <user> -p <senha>
docker pull  hub.davinti.com.br:443/app-dono/app-cliente:latest

As mesmas credenciais são reaproveitadas mais adiante para baixar a imagem do vproxy. Em caso de erro de login ou pull, a mensagem do Docker é exibida e o instalador encerra ao pressionar qualquer tecla.

5. Pergunta de IP público (StepIPQuestion)

  • Sim → pula o bloco do vproxy e vai direto para StepAppConfig.
  • Não → vai para StepWireguardConfig.

6–9. Bloco vproxy (somente sem IP público)

  1. StepWireguardConfig — coleta PRIVKEY, VIP, PSK, PROXY_EDPS, MTU e PROTO (UDP/TCP).
  2. StepGenerateWireguardFile — grava o arquivo envs (ver config.go, GenerateWireguardConfig).
  3. StepDownloadWireguard — faz login e pull da imagem davinti-vproxy.
  4. StepRunWireguard — sobe o container vproxy com --cap-add=NET_ADMIN, --device /dev/net/tun, --env-file envs e o conecta à rede app-dono_app. Após subir, espera 2s e verifica se o status é running; se não, mostra os últimos logs do container.

Ao final do bloco, segue para StepAppConfig.

10–13. Configuração da aplicação

Quatro formulários sequenciais preenchem o ConfigValues:

  • Aplicação: URL do servidor central e token de inscrição.
  • Servidor: porta, timeout, ambiente (development/production) e modo compatibilidade (seccomp=unconfined).
  • Banco de dados: tipo (postgres/oracle), URL de conexão, conexões máx./mín.
  • Certificado: diretório local com os certificados mTLS.

14. Geração do config.toml (StepGenerateFile)

WriteConfigFile valida os campos numéricos (port, timeout, max_conns, min_conns) e grava o config.toml. Em caso de valor inválido, exibe o erro e permite tentar novamente.

15. Subida do container do app (StepRunDocker)

RunAppClienteContainer remove um container homônimo existente, garante a rede app-dono_app, e executa docker run com:

  • usuário/grupo do host (-u uid:gid);
  • mapeamento de porta <porta do host>:8080;
  • volume do config.toml em /app/config.toml;
  • volume do diretório de certificados em /app/certs;
  • --restart unless-stopped.

Verifica o status running da mesma forma que o vproxy.

16. Conclusão (StepDone)

Exibe "Instalação realizada com sucesso!". Qualquer tecla encerra.

Tratamento de erros

Em etapas de download, geração de arquivo e subida de container, qualquer falha:

  • interrompe o avanço automático;
  • mostra a mensagem/erro do Docker (ou do sistema de arquivos) com estilo de erro;
  • permite sair (em downloads) ou tentar novamente (em geração/run) conforme a etapa.