# 06 — Deployment & containerização (Docker)

## Objetivo
Encapsular o microsite num **contentor Docker** para funcionamento **independente
e isolado**: a aplicação corre da mesma forma em qualquer host com Docker, sem
depender de um Node/npm instalado na máquina nem de configuração externa.

> Motivação adicional: nesta máquina não existe Node/npm instalados — o Docker
> remove essa dependência do host (o build corre dentro da imagem). Ver
> [CHANGELOG.md](./CHANGELOG.md).

## Estratégia
**Multi-stage build:**
1. **Stage `build`** (`node:22-alpine`): `npm ci` (ou `npm install`) + `npm run
   build` → gera `dist/` (estático Vite).
2. **Stage `runtime`** (`nginx:1.27-alpine`): serve o `dist/` como conteúdo
   estático. Imagem final pequena, sem Node nem código-fonte.

Como é uma SPA single-page, o runtime é um servidor estático; o nginx trata de
fallback de rotas para `index.html` e do cache de assets.

## Artefactos a criar (após aprovação)
| Ficheiro | Função |
|----------|--------|
| `Dockerfile` | Build multi-stage (node → nginx) |
| `.dockerignore` | Excluir `node_modules`, `dist`, `.git`, etc. do contexto |
| `nginx.conf` | Config nginx: porta 80, SPA fallback, gzip, cache de assets |
| `docker-compose.yml` | Orquestração local (build + port mapping + healthcheck) |

## Contrato de operação
- **Build:** `docker build -t resilience-microsite .`
- **Run:** `docker run --rm -p 8080:80 resilience-microsite` → http://localhost:8080
- **Compose:** `docker compose up --build` (porta exposta `8080:80` por defeito).
- **Porta interna:** 80 (nginx). **Porta externa:** configurável (default 8080).
- **Sem estado:** não há volumes nem dependências externas (site 100% estático).
- **Healthcheck:** GET `/` devolve 200.

## nginx — requisitos
- `try_files $uri $uri/ /index.html;` (suporte a deep-link de âncoras/refresh).
- `gzip on` para HTML/CSS/JS.
- Cache longo para assets com hash (`/assets/*`), `no-cache` para `index.html`.
- Servir em IPv4/IPv6, porta 80.

## Notas
- O `Dockerfile` torna a verificação do gate de TypeScript reprodutível mesmo sem
  Node no host: `npm run build` (que corre `tsc -b`) executa no stage de build; se
  houver erros de TS, o `docker build` falha — passando a ser o método de
  verificação de aceitação enquanto não houver Node instalado localmente.
- Versões base pinadas (`node:22-alpine`, `nginx:1.27-alpine`) para reprodutibilidade.
