Přeskočit obsah

Deployment: Infrastruktura a prostředí

Poslední aktualizace: 24. března 2026


TL;DR

Tři prostředí, všechna v EU, žádná ztráta dat. Self-hosted služby na GCP VM (e2-small), aplikační data v Supabase (Frankfurt), frontend na Vercelu.

Prostředí Supabase n8n BookStack Frontend
Local Supabase CLI (Docker) Docker Compose Nepotřeba pnpm dev
Staging sofie-staging (EU Frankfurt) Sdílená VM, neaktivní workflow Sdílená VM Vercel preview
Produkce sofie-prod (EU Frankfurt) Aktivní workflow Sdílená VM Vercel prod

1. Prostředí: Local → Staging → Prod

Lokální vývoj

~/Dev/sofie-kosmo/
├── web/                → Next.js app (pnpm dev)
├── supabase/           → Supabase CLI (supabase start)
│   ├── migrations/     → SQL migrace (verzované v Gitu)
│   └── seed.sql        → Testovací data (fiktivní, bezpečná pro Git)
├── infra/              → Docker Compose (VM produkce)
└── n8n/                → Exportované workflow JSON

supabase start spustí celý Supabase stack lokálně v Dockeru: PostgreSQL 15 (s pgvector), Auth (GoTrue), Realtime, Storage, Studio dashboard. Migrace, RLS policies, triggers — vše se testuje lokálně.

Supabase — dva projekty

sofie-staging sofie-prod
Region EU Frankfurt EU Frankfurt
Kdo používá Dev + ředitel (testování) Škola (produkce)
Data Kopie z produkce Reálná (zálohovaná)
pgvector Enabled Enabled

Flow migrací

Lokální (supabase start)
  │ supabase db reset — testuj migraci
Staging (sofie-staging)
  │ supabase db push --linked — aplikuj migraci
  │ Ředitel testuje
Produkce (sofie-prod)
  │ supabase link --project-ref <prod-ref>
  │ supabase db push --linked
  ✅ Hotovo

Vercel — Next.js hosting

  • MVP: Vercel free tier. Frontend neobsahuje osobní data (ta jsou v Supabase v EU). Next.js renderuje UI, osobní data se tahají client-side ze Supabase EU endpointu. Akceptovatelné pro MVP.
  • Produkce: Zvážit Vercel Pro s EU regionem ($20/měs) nebo Cloud Run v EU.

Data strategie

Prostředí Zdroj dat V Gitu? Reálná data?
Local supabase/seed.sql Ano Fiktivní
Staging Kopie z produkce Ne Ano
Produkce Živá data Ne Ano

2. GCP VM — self-hosted služby

Parametry VM

Parametr Hodnota
VM typ e2-small (2 vCPU, 4 GB RAM)
Boot disk 30 GB SSD (OS + Docker)
Data disk 100 GB HDD, oddělený, mountnutý jako /data
Statická IP Pevná veřejná adresa
Region europe-west1-b (Belgie, GDPR)
Cena ~$25/měs (VM + disky + IP)

Oddělený datový disk přežije restart i smazání VM, lze zvětšit online, umožňuje samostatné zálohy.

Kontejnery (8)

Kontejner Image RAM limit Účel
traefik traefik:v3.3 128 MB Reverse proxy
landing nginx:alpine 64 MB Rozcestník sofie.education
postgres postgres:16-alpine 1 GB Sdílená DB (n8n, listmonk)
redis redis:7-alpine 256 MB Cache
n8n n8nio/n8n (custom build) 256 MB Workflow orchestrátor (Sofie AI)
listmonk listmonk/listmonk 256 MB Newsletter
bookstack linuxserver/bookstack 512 MB Wiki / znalostní báze
bookstack-db mariadb:11 512 MB BookStack MySQL

Celkem RAM: ~3 GB (VM má 4 GB). Po migraci z Dify: 8 kontejnerů místo 16, 3 GB místo 11 GB.

Služby a URL

Služba URL Účel
n8n ai.sofie.education Workflow orchestrátor, Sofie AI chat
BookStack wiki.sofie.education Znalostní báze (veřejná + interní)
Listmonk newsletter.sofie.education Newsletter pro rodiče
Landing sofie.education Rozcestník
Docs docs.sofie.education Cloudflare Pages (MkDocs)

Reverse proxy: Traefik

Internet → Cloudflare (HTTPS, edge certifikát) → sofie-vm (port 80)
                                                     ↓ Traefik
    ai.sofie.education         → n8n (:5678)
    newsletter.sofie.education → Listmonk (:9000)
    wiki.sofie.education       → BookStack (:80)
    sofie.education            → Landing page (:80)

HTTPS zajišťuje Cloudflare (SSL mode: Flexible). Traefik routuje po HTTP.

Data volumes

/data/
├── postgres/       → PostgreSQL data (n8n, listmonk)
├── redis/          → Redis persistence
├── n8n/            → n8n workflow data, credentials
├── bookstack/      → BookStack config + uploads
├── bookstack-db/   → MariaDB data
├── landing/        → Landing page HTML
└── backups/        → Database dumps

DNS: Cloudflare

  • Doména: sofie.education (registrovaná u Wedosu, DNS na Cloudflare)
  • CDN cache, DDoS ochrana zdarma, rychlá propagace DNS změn (~30s)

3. n8n + Vertex AI

Proč n8n (ne Dify)

Dify n8n
RAM ~4 GB (7 kontejnerů) ~256 MB (1 kontejner)
Email trigger Custom glue code Nativní (IMAP, Gmail, webhook)
Integrace ~20 tools 400+ nodes
Google Workspace Omezená Gmail, Calendar, Drive, Sheets

CC email → extrakce → KB → routing = workflow problém, ne chatbot problém.

Proč Vertex AI (ne Gemini API Studio)

Gemini API (AI Studio) Vertex AI
EU data residency Ne Ano (europe-west3 Frankfurt)
DPA Consumer ToS GCP Enterprise DPA
Autentizace API klíč GCP IAM / service account

Pro školu s GDPR → Vertex AI.

Modely

  • Gemini 2.0 Flash — hlavní model (klasifikace, extrakce, běžné odpovědi)
  • Gemini 2.0 Pro — komplexní úlohy (sumarizace, reformulace, plánování)
  • text-embedding-004 — embeddingy pro RAG (pgvector v Supabase)

n8n: staging vs produkce

Jedna instance n8n na VM. Rozlišení přes workflow management:

  1. Dev vytvoří workflow v n8n UI
  2. Workflow je NEAKTIVNÍ (= staging), tag staging
  3. Test s testovacími daty
  4. Ředitel otestuje
  5. Aktivace workflow (= produkce), tag production

Separátní credentials pro staging vs prod Supabase.

CC mapování školy

Ředitel nemusí „plnit systém". Komunikuje jako normálně a přidá sofie@sofie.education do CC:

Fáze 0 (Den 1–14): Pasivní pozorování
  Email s CC → n8n → Gemini extrahuje fakta → BookStack draft → loguje

Fáze 1 (paralelně): Chat na ai.sofie.education
  Ředitel → chat trigger → Gemini → KB zápis/RAG odpověď

Fáze 2 (Týden 3–4): Aktivní CC email
  n8n reaguje na CC emaily → navrhuje odpovědi učitelům

Fáze 3 (Měsíc 2+): Škola se zmapovala
  Měsíční report: zmapovanost KB, kontakty, chybějící info

RAG: BookStack → pgvector (Supabase)

BookStack (lidsky čitelný obsah)
    ↓ n8n sync workflow (denně / on-change webhook)
    ├─ GET /api/pages → Markdown
    ├─ text-embedding-004 → vector
    └─ Supabase: INSERT INTO embeddings

Dotaz:
    ├─ Embedding dotazu
    ├─ pgvector similarity search
    ├─ Top 5 výsledků → kontext
    └─ Gemini Pro: odpověď s citacemi

Náklady

Položka Měsíčně
VM e2-small + disky + IP ~$25
Vertex AI (Flash + Pro) ~$10–20
Supabase $0 (free tier)
Celkem ~$35–45

$300 kreditů = ~8–12 měsíců provozu.


4. Zálohovací strategie

Co kde zálohovat

Data Kde žijí Záloha Frekvence Retence
App data (studenti, docházka) Supabase prod Supabase auto + pg_dump na VM Denně 30 dní
Memories (pgvector) Supabase prod Součást pg_dump Denně 30 dní
KB obsah BookStack (MariaDB) mysqldump na VM Denně 30 dní
KB soubory BookStack (/data/bookstack) GCP disk snapshot Denně 14 dní
n8n workflow PostgreSQL (n8n DB) pg_dump + Git export Denně Git = neomezeně
Newsletter Listmonk (PostgreSQL) pg_dump Denně 30 dní
Konfigurace Git repo Git Při změně Neomezeně

GCP disk snapshot (automatický)

gcloud compute resource-policies create snapshot-schedule sofie-backup \
  --region=europe-west1 \
  --max-retention-days=14 \
  --daily-schedule \
  --start-time=02:00

gcloud compute disks add-resource-policies sofie-data-disk \
  --resource-policies=sofie-backup \
  --zone=europe-west1-b

Disaster recovery

Scénář Postup Downtime
Služba spadne docker compose restart ~30s
VM nereaguje gcloud compute instances reset ~2 min
Data poškozena Nový disk ze snapshotu ~10 min
Supabase výpadek Čekáme (SaaS), app degraduje gracefully N/A
Celý rebuild Snapshot → nová VM + Supabase restore ~1 hod

5. EU Data Residency

Služba Region GDPR
GCP VM europe-west1 (Belgie) OK
Vertex AI europe-west3 (Frankfurt) OK
Supabase EU Frankfurt OK
Cloudflare DNS Edge (globální, ale data = jen DNS) OK
Vercel US (free tier) Akceptovatelné pro MVP (frontend nemá PII)
Google Workspace EU (pokud nastaveno) OK

6. CI/CD — trunk-based development

Princip: KISS pro solo vývojáře

Žádná staging větev. Vercel automaticky generuje preview URL pro každý PR — to je staging.

feature branch → PR → Vercel preview (+ staging Supabase) → review → merge to main → prod deploy

Git branching

Větev Deploy kam Kdy
main Production (app.sofie.education) Merge PR → auto-deploy
feature/* / PR Preview (unikátní URL per PR) Push → Vercel auto-preview

Žádná staging větev — zbytečná merge complexity pro jednoho vývojáře.

Vercel konfigurace

Production Branch:  main
Preview Branches:   * (všechny ostatní)
Environment Variables:
  Production:  NEXT_PUBLIC_SUPABASE_URL = <prod>
  Preview:     NEXT_PUBLIC_SUPABASE_URL = <staging>

Backend staging

Služba Staging Produkce
Supabase sofie-staging projekt sofie-prod projekt
n8n Workflow s tagem staging (neaktivní) Workflow s tagem production (aktivní)
BookStack Sdílená instance Sdílená instance
GCP Bucket sofie-media-staging sofie-media

Flow

┌──────────────────────────────────────────────────┐
│                 DEV (lokální)                     │
│  Next.js (pnpm dev) ←→ Supabase CLI (Docker)    │
│  Migrace: supabase migration new → test → commit │
└──────────────────┬───────────────────────────────┘
                   │ git push (feature branch)
┌──────────────────────────────────────────────────┐
│              PREVIEW (per-PR)                     │
│  Vercel preview URL ←→ Supabase staging           │
│  supabase db push --linked (staging)              │
│  Ředitel testuje na preview URL                   │
└──────────────────┬───────────────────────────────┘
                   │ merge PR to main
┌──────────────────────────────────────────────────┐
│              PRODUCTION                           │
│  app.sofie.education ←→ Supabase prod             │
│  supabase db push --linked (prod)                 │
│  n8n workflow activate                            │
└──────────────────────────────────────────────────┘

Checklist pro deploy

  • Migrace otestovaná lokálně (supabase db reset)
  • PR vytvořen, Vercel preview funguje
  • Migrace pushnutá na staging Supabase
  • Ředitel otestoval na preview URL
  • PR merged → Vercel auto-deploy to prod
  • Migrace pushnutá na prod Supabase
  • n8n workflow aktivován (pokud změněn)
  • Smoke test (chat, CC email, KB lookup)

7. Denní development workflow

Lokální vývoj

supabase start                  # Lokální Supabase (Docker)
cd web && pnpm dev              # Next.js na localhost:3000

Supabase CLI spustí Postgres, Auth, Storage, Studio (localhost:54323).

Změna DB

supabase migration new popis → napiš SQL → supabase db reset (smaže + znovu aplikuje) → commitni s frontend kódem.

Vždy migrace PŘED frontendem — DB o krok napřed, frontend se adaptuje.

n8n workflow nasazení

  1. Vytvoř/uprav workflow, tag staging, neaktivní
  2. Otestuj s testovacími daty (credentials → sofie-staging)
  3. Přetaguj na production, aktivuj (credentials → sofie-prod)
  4. Exportuj JSON do n8n/, commitni

Monitoring (minimum)

Nástroj Co sleduje Cena
Uptime Robot Dostupnost app/ai/wiki.sofie.education Zdarma
Vercel Analytics Frontend performance Free tier
Supabase Dashboard DB velikost, API, Auth logy Součást plánu
GCP Monitoring VM CPU/RAM/disk Součást GCP
n8n Execution Log Chyby ve workflow Součást n8n

Feedback loop: učitelé → vývoj

Primární: Učitel → Sofie chat → Gemini structured output → GitHub Issue → dev notifikace.

Záloha: Google Form (kdo, typ, popis) → Google Sheets → volitelně n8n → GitHub Issue.


Metriky úspěchu (za 1 měsíc)

Metrika Cíl Jak měřit
Ředitel používá chat/CC Denně n8n execution log
KB má reálný obsah > 30 stránek BookStack API
CC emaily zpracované > 50 n8n log
FAQ odpovědi z RAG > 10 automatických n8n log
Budget < $40/měs GCP billing
VM RAM utilization < 80 % GCP monitoring