# 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 -p 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 `: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.