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:
- Dev vytvoří workflow v n8n UI
- Workflow je NEAKTIVNÍ (= staging), tag
staging - Test s testovacími daty
- Ředitel otestuje
- 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.
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 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í
- Vytvoř/uprav workflow, tag
staging, neaktivní - Otestuj s testovacími daty (credentials →
sofie-staging) - Přetaguj na
production, aktivuj (credentials →sofie-prod) - 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 |