Files
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

128 lines
6.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`](../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`](../internal/tui/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.