obsidian-vault/Pizza-Digital/docs/SPEC-FASE1.md
Roger 62a20a2573 Add Pizza-Digital docs to Obsidian vault and sync with VM125.
Mirror all SPECs and construction docs from pizza-digital, add hub/sidebar links and bidirectional sync scripts.
2026-11-09 19:45:11 +00:00

232 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SPEC Fase 1 — MVP Cozinha Digital (detalhamento)
| Campo | Valor |
|-------|--------|
| **Produto** | Pizza Digital |
| **Fase** | 1 — MVP Cozinha Digital |
| **Versão** | 0.2.0 (ampliação da SPEC 0.1) |
| **Data** | 2026-07-23 |
| **Host de desenvolvimento** | Proxmox BIG · VM **125** · `pizza-digital` · `10.10.10.125` |
| **SO** | Debian 12 |
| **Users** | `mini` (sudo) · `root` |
| **Referência rotas (fase 2)** | **rusterando** (oficial) + CityFoods Gestor de Rotas / ORS |
| **Referência KDS** | CityFoods Cozinha Digital + kitchenOS / restaurant-pos |
| **Sequência** | SPEC §15 — S0…S9 · KDS antes de rotas · S1 ✅ · próximo S2 |
---
## 1. Objetivo da Fase 1
Entregar uma **Cozinha Digital operacional** para pizzaria piloto:
1. PDV web cria pedido
2. KDS multi-estação (Massa → Montagem → Forno → Expedição)
3. Timers / priorização
4. Etiqueta (ESC/POS ou PDF)
5. Dashboard de tempos
6. Gate para despacho (`order.ready`) — **sem** otimização de rotas ainda (Fase 2)
**Fora da Fase 1:** app motoboy, ORS, iFood, cardápio público, multi-loja.
---
## 2. Infraestrutura (BIG)
| Item | Valor |
|------|--------|
| Hypervisor | Proxmox BIG (`big1-proxmox` / `95.216.14.162`) |
| VMID | **125** |
| Nome | `pizza-digital` |
| Bridge | `vmbr4000` |
| IP LAN | `10.10.10.125/24` |
| Gateway | `10.10.10.1` (pfSense) |
| DNS | `8.8.8.8` / `8.8.4.4` |
| vCPU | 4 |
| RAM | 8 GB |
| Disco | 80 GB |
| Cloud-init | `local:snippets/vm125-pizza-digital-init.yaml` |
| Hardening | fail2ban (sshd) · PasswordAuthentication yes · PermitRootLogin yes |
| Stack base | Docker + Compose · Node 22 · pnpm · Git · build-essential · nginx · redis-tools · psql client |
### 2.1 Acesso
```text
# Via Proxmox BIG (LAN)
ssh mini@10.10.10.125
# Ou jump pelo host
ssh big1-proxmox
ssh mini@10.10.10.125
```
SSH externo (porta NAT tipo 2525) **não** está nesta fase — exige regra no pfSense + FORWARD no Proxmox (**não** alterar `/etc/network/interfaces` sem confirmação ×3).
### 2.2 Workspace na VM
```text
/home/mini/pizza-digital/ # monorepo
/opt/pizza-digital/ # dados / runtime
/opt/pizza-digital/data/ # volumes locais
```
---
## 3. Entregáveis Fase 1 (Definition of Done)
| # | Entregável | Critério de aceite |
|---|------------|--------------------|
| 1 | Monorepo bootstrap | `apps/api`, `apps/web`, `packages/domain`, `docker-compose.yml` |
| 2 | Auth + RBAC mínimo | login gestor / pdv / kds |
| 3 | Cardápio | CRUD item + modifiers + meia-a-meia + mapa → estações |
| 4 | PDV | criar pedido delivery/balcão com observação |
| 5 | Order state machine | confirmado → em_producao → pronto |
| 6 | KDS multi-estação | 4 telas; WebSocket ≤ 500 ms |
| 7 | Timers SLA | verde/amarelo/vermelho |
| 8 | Priorização | reordenar / marcar urgente |
| 9 | Etiquetas | imprimir ou PDF com `#CODE` + obs |
| 10 | Dashboard | tempo médio por estação + fluxo do pedido |
| 11 | Seed pizzaria | dados demo (sabores, bordas, bebidas) |
---
## 4. Estações (template Pizzaria) — freeze Fase 1
| Código | Nome | SLA default | Recebe |
|--------|------|-------------|--------|
| `massa` | Massa | 3 min | base / borda |
| `montagem` | Montagem | 5 min | molho, queijo, toppings, meia-a-meia |
| `forno` | Forno | 8 min | pizza assando |
| `expedicao` | Expedição | 3 min | embalagem + etiqueta + conferência |
| `bebidas` | Bebidas (opc.) | 2 min | refrigerante / água |
Regra: pedido só `pronto` quando **todas** as estações obrigatórias do pedido concluírem; expedição é a última.
---
## 5. Stack Fase 1 (congelada para implementação)
| Camada | Escolha |
|--------|---------|
| API | **NestJS** + TypeScript |
| Web | **React** + Vite + TypeScript (PWA) |
| Realtime | **Socket.io** |
| DB | **PostgreSQL 16** (Docker) |
| Cache/pubsub | **Redis 7** (Docker) |
| ORM | Prisma |
| Print | ESC/POS node + PDF fallback |
| Deploy local | Docker Compose na VM 125 |
Referências de implementação:
- KDS realtime → kitchenOS / Tasty-Station
- Estações → restaurant-pos
- Rotas (só na Fase 2) → rusterando + OpenRouteService
---
## 6. Apps / rotas web (Fase 1)
| App | Path | Papel |
|-----|------|-------|
| PDV | `/pdv` | Caixa |
| KDS | `/kds/:station` | Cozinha |
| Despacho (lista) | `/despacho` | Fila `pronto` (sem ORS) |
| Admin | `/admin` | Cardápio, users, métricas |
---
## 7. Eventos WebSocket (Fase 1)
```text
order.created
order.updated
order.canceled
ticket.upserted
ticket.bumped
order.ready
label.printed
```
Rooms: `store:{id}` · `store:{id}:station:{stationId}`
---
## 8. Módulo Rotas — ponte para Fase 2 (não implementar agora)
Contrato mínimo que a Fase 1 **já deve expor**:
```text
order.status === 'pronto'
→ aparece em /despacho
→ payload inclui: address, bairro, lat/lng (se houver), priority
```
Na Fase 2 (CityFoods-like):
1. Agrupar por bairro
2. Atribuir motoboy
3. ORS tour (rusterando)
4. PWA entregador + tracking
5. Comissão entregador
---
## 9. Sprints Fase 1 (na VM 125)
| Sprint | Dias úteis | Entrega |
|--------|------------|---------|
| **S0** | 1 | Repo + Docker Compose (Postgres/Redis) + domain types |
| **S1** | 2 | Auth + Store + Cardápio + estações |
| **S2** | 2 | Pedidos PDV + state machine |
| **S3** | 3 | KDS realtime multi-estação + timers |
| **S4** | 2 | Etiquetas + priorização + dashboard |
| **S5** | 2 | Seed + teste piloto + hardening |
---
## 10. Segurança na VM (Fase 1)
- [x] fail2ban sshd
- [x] PasswordAuthentication + root (padrão iTecnologys / cloud-init)
- [ ] UFW: allow 22/tcp, 80/tcp, 443/tcp, 3000/tcp (dev) — aplicar após bootstrap
- [ ] Não expor Postgres/Redis na WAN
- [ ] Secrets em `.env` (não commit)
---
## 11. Checklist de bootstrap VM 125
- [x] VM criada e running (VMID 125, Debian 12, 4 vCPU / 8 GB / 80 GB)
- [x] Ping `10.10.10.125` a partir do BIG (`vmbr4000`)
- [x] SSH `root@` / `mini@10.10.10.125` OK (senha `805353`)
- [x] Docker Compose S0: `postgres` + `redis` + `api` + `web` + `gateway` (:3000) UP
- [x] `GET /api/health` → redis up · `GET /` → 200
- [x] `fail2ban` sshd ativo
- [x] Docker + Compose + Node 22 + pnpm + TypeScript/tsx
- [x] `sshd -T` → `passwordauthentication yes` · `permitrootlogin yes`
- [x] Workspace `/home/mini/pizza-digital` com SPEC
- [ ] Monorepo código (S0) — próximo passo
- [ ] SSH externo NAT (porta dedicada) — opcional; **não** altera `/etc/network/interfaces` sem 3 confirmações
### Acesso rápido
```bash
# Do Windows (ProxyJump)
ssh pizza-digital
# Do BIG Proxmox (necessário route helper se dual-bridge)
/usr/local/bin/pizza-digital-route.sh
ssh mini@10.10.10.125
```
---
## 12. Changelog desta ampliação
### 0.2.0 — 2026-07-23
- Detalhamento completo da **Fase 1**
- Infra VM 125 no Proxmox BIG documentada
- Stack congelada (NestJS + React + Postgres + Redis + Socket.io)
- Definition of Done e sprints S0–S5
- Ponte explícita para Gestor de Rotas (Fase 2 / CityFoods + rusterando)