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>
128 lines
6.5 KiB
Markdown
128 lines
6.5 KiB
Markdown
# 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.
|