# 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.