Saltar al contingut principal

Com funciona RestaPro per dins

Per a hostalers tècnics, partners o qualsevol que vulgui entendre l'arquitectura sense llegir codi.

Stack en una imatge

Internet (HTTPS)

Traefik (TLS · rate limit 100 req/s + burst)

nginx (gzip · cau immutable · headers de seguretat)

React 19 + TypeScript (build estàtic)

Supabase (PostgreSQL + Edge Functions + Auth + Storage)

Frontend estàtic servit per nginx, sense servidor d'aplicació tradicional. Tot el que no és UI corre en Edge Functions Deno o en PostgreSQL via RLS.

Frontend

  • React 19 + TypeScript + Vite.
  • Build estàtic compilat a HTML+JS+CSS amb hashes al nom (cau eternament).
  • Tailwind CSS 4 amb tokens en oklch().
  • shadcn/ui + base-nova com a sistema de components.
  • Servit per nginx a :8090.
  • TanStack React Query per a state del servidor.
  • React Hook Form + Zod per a formularis.

Backend: Supabase

  • PostgreSQL gestionat a Frankfurt (UE). Compleix RGPD per disseny.
  • Edge Functions Deno: ~60 funcions serverless que corren sota demanda.
  • Auth: JWT amb refresh tokens, correu+contrasenya + Google OAuth.
  • Storage: per a logos, portades, imatges de carta.
  • Realtime: notificacions instantànies via WebSocket.
  • pg_cron: tasques programades (cron de correus, expiració de propostes, etc.).

Seguretat multi-tenant: Row Level Security (RLS)

Cada taula amb dades de client té polítiques RLS que filtren files segons l'usuari logat a nivell de PostgreSQL:

USING (workspace_id IN (
SELECT workspace_id FROM workspace_users
WHERE user_id = auth.uid()
))

Encara que algú piratés una sessió, la BD rebutja consultes entre workspaces. És seguretat a nivell de DBMS, no d'aplicació.

Xifratge

  • En trànsit: HTTPS/TLS 1.3 amb certificats Let's Encrypt automatitzats per Traefik.
  • En repòs: PostgreSQL xifra el volum.
  • Contrasenyes: bcrypt (no reversibles).
  • Secrets (Stripe API key, Gemini key, Resend, etc.): a Supabase Vault, no a .env ni al repositori.

IA: Gemini + Pinche

  • Gemini 2.5 Flash de Google amb function calling.
  • Pinche: 25 eines (10 escriptura + 15 lectura).
  • Cada crida es loga a pinche_chat_logs per a auditoria.
  • Política Vertex AI de Google: les dades no es fan servir per entrenar models.

Notificacions

Realtime (instantani)

Quan entra una reserva en línia, tots els dispositius de l'equip reben un toast en temps real via Supabase Realtime (WebSocket sobre PostgreSQL CDC).

Correu transaccional (Resend)

  • Enviament de confirmacions, recordatoris, alertes, campanyes.
  • Idempotència als webhooks (resend_processed_events): si Resend reenvia per timeout, es processa una sola vegada.
  • Email logs auditables: cada enviament amb timestamp, status, tokens.
  • Headers List-Unsubscribe RFC 5322 perquè Gmail doni un clic.

Pagaments: Stripe

  • Subscripcions gestionades per Stripe Billing.
  • Checkout Session + Portal de client per a pagaments i autogestió.
  • Webhooks amb idempotency check (stripe_processed_events).
  • RestaPro no emmagatzema targetes — només Stripe Customer ID i Subscription ID.

Allotjament

  • Supabase: AWS Frankfurt (UE). Replicació + còpies de seguretat diàries amb retenció 30 dies.
  • CDN: Cloudflare per a actius estàtics.
  • Edge Functions: latència de servidor proper a l'usuari.

RGPD

  • Dades a Frankfurt, sense transferències fora de la UE sense salvaguardes.
  • Dret a l'oblit via RPC gdpr_delete_customer: anonimitza nom, correu, telèfon a customers, customer_identities, email_logs, email_queue, marketing_*. Manté reserves per a auditoria/comptabilitat.
  • Auditoria completa a activity_logs.
  • Més a Privacitat i RGPD.

Còpia de seguretat i recuperació

  • Supabase backups diaris automàtics (retenció 30 dies).
  • Replicació geogràfica.
  • En cas d'esborrat accidental: contactar amb suport de Supabase per a restore des de backup específic (RTO ~4 h).

Monitoratge

  • Sentry: captura d'errors al frontend amb userId + restaurant_id com a tags. Filtres antibot.
  • Logs estructurats als edge functions via createLogger amb metadades.
  • Activity log a la BD per a accions sensibles (canvis de rol, GDPR delete, etc.).

CI/CD

  • GitHub Actions executa lint + typecheck + tests + build a cada push.
  • Smoke tests HTTP post-deploy: si fallen, avortem.
  • Snapshots dels últims 10 builds a /opt/backups/restapro-dist/ per a rollback ràpid.

Continuous deployment

  • Cada commit a main pot arribar a producció després de revisió manual.
  • Build ID = git SHA, visible a <meta name="restapro:build-id">.
  • Sense versionat semàntic — els canvis flueixen contínuament.

Més a Versionat i publicació.

ESENCA