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