sass-imobiliaria/.specify/features/002-docker-setup/plan.md

114 lines
3 KiB
Markdown

# Implementation Plan: Docker Setup
**Branch**: `002-docker-setup`
**Spec**: `.specify/features/002-docker-setup/spec.md`
**Created**: 2026-04-13
## Constitution Check
- ✅ Design-First: não se aplica (infra)
- ✅ Separation of Concerns: Flask e React permanecem desacoplados, Docker apenas orquestra
- ✅ Spec-Driven: este plano deriva da spec aprovada
- ✅ Security: nenhuma secret hardcoded; `.env` no gitignore
- ✅ Simplicity: sem multi-stage build, sem nginx — foco em dev environment
---
## Phase 1 — Backend Dockerfile
**Objetivo**: Containerizar o Flask app usando python:3.12-slim e uv.
**Arquivos**:
- `backend/Dockerfile`
**Detalhes**:
- Base: `python:3.12-slim`
- Instalar `uv` via pip
- Copiar `pyproject.toml``uv sync` → copiar código
- Entrypoint: script shell que executa `flask db upgrade && python seeds/seed.py && python run.py`
- Porta exposta: 5000
**Critério de conclusão**: `docker build -t backend ./backend` conclui sem erro.
---
## Phase 2 — Frontend Dockerfile
**Objetivo**: Containerizar o servidor de desenvolvimento Vite com hot-reload.
**Arquivos**:
- `frontend/Dockerfile`
**Detalhes**:
- Base: `node:20-alpine`
- Copiar `package*.json``npm ci` → copiar código
- CMD: `npm run dev -- --host 0.0.0.0` (necessário para expor dentro do container)
- Porta exposta: 5173
- O `vite.config.ts` já tem proxy `/api → http://localhost:5000`; atualizar para `http://backend:5000` (nome do serviço Docker)
**Critério de conclusão**: `docker build -t frontend ./frontend` conclui sem erro.
---
## Phase 3 — docker-compose.yml
**Objetivo**: Orquestrar db + backend + frontend com dependências e healthchecks.
**Arquivos**:
- `docker-compose.yml` (raiz)
- `.env.example` (atualizar/criar na raiz)
**Serviços**:
```yaml
db:
image: postgres:16-alpine
healthcheck: pg_isready -U ${POSTGRES_USER}
depends_on: (nenhum)
backend:
build: ./backend
depends_on:
db: { condition: service_healthy }
environment:
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
frontend:
build: ./frontend
depends_on: [backend]
volumes:
- ./frontend/src:/app/src ← hot-reload
- ./frontend/public:/app/public
```
**Critério de conclusão**: `docker-compose config` valida sem erro; `docker-compose up` sobe os 3 serviços.
---
## Phase 4 — start.ps1
**Objetivo**: Script PowerShell de conveniência na raiz.
**Arquivos**:
- `start.ps1` (raiz)
**Lógica**:
1. Verificar se `docker` está disponível no PATH
2. Se não: exibir mensagem com link para Docker Desktop e sair
3. Se sim: executar `docker-compose up --build`
**Critério de conclusão**: `.\start.ps1` inicia o ambiente ou exibe erro informativo.
---
## Sequência de execução
```
Phase 1 (backend/Dockerfile)
Phase 2 (frontend/Dockerfile + vite.config proxy update)
Phase 3 (docker-compose.yml + .env.example)
Phase 4 (start.ps1)
Validação: docker-compose up --build → testar endpoints
```