You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
2.4 KiB
Markdown
50 lines
2.4 KiB
Markdown
# 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.
|