Deployment: Infrastruktura a prostředí
Poslední aktualizace: 2026-05-15
Účty a placené plány
| Služba | Plán | Cena | Co odemyká |
|---|---|---|---|
| GitHub | Pro (placený od 2026-05) | $4/měsíc | Branch protection na private repo, CODEOWNERS gate, 3000 Actions minut/měsíc |
| Supabase Cloud | Pro (placený od 2026-05-15) | $25/měsíc | Mailer 30+/h (Free 4/h), 7-day PITR, daily backups, DB branching (mcp__supabase__create_branch), 8GB DB, 250GB transfer |
| Vercel | Free | $0 | 100GB bandwidth, 1 concurrent build, preview deploys veřejné (žádné password protection) |
| GCP VM | e2-small | ~$13/měsíc | Twenty CRM + BookStack hosting |
| Resend | Free | $0 | 3000 mailů/měsíc — bulk Sofie mailing (transactional zatím přes Supabase mailer) |
Otevřené rozhodnutí: Vercel Pro ($20/měsíc) — viz „Co odemyká Vercel Pro" níže.
Aktuální URL adresy
| Prostředí | URL | Poznámka |
|---|---|---|
| Produkce (MVP) | sofie-kosmo.vercel.app | Quick-login buttons zapnuté (demo); vypne se až bude reálná data |
| Supabase Cloud | iwcisgvhwdzztrfdrpkl.supabase.co | Pro plan (od 2026-05-15), Frankfurt EU |
| Supabase Studio | supabase.com/dashboard/project/iwcisgvhwdzztrfdrpkl | Admin UI |
| GitHub repo | github.com/docek/sofie-kosmo | Auto-deploy na push do main |
| Doména (plán) | app.sofie.education | DNS přes Cloudflare, zatím nenastaveno |
TL;DR
Dvě prostředí dnes (Local + Cloud), v EU, žádná produkční data (k 5/2026). Self-hosted služby na GCP VM (e2-small), aplikační data v Supabase Cloud Free (1 projekt), frontend na Vercelu.
| Prostředí | Supabase | BookStack | Frontend |
|---|---|---|---|
| Local | Supabase CLI (Docker) | Nepotřeba | pnpm dev |
| Cloud (dev → produkce) | iwcisgvhwdzztrfdrpkl (Free, EU Frankfurt) |
GCP VM (sdílená) | Vercel main |
Staging strategie (po Pro upgrade 2026-05-15):
mcp__supabase__create_branchje nyní dostupný — per-branch Supabase DB preview je možné. Implementace: prozatím neaktivováno, zapne se až bude první PR vyžadující ostré DB migrace.
1. Prostředí: Local → Cloud
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 — Twenty + BookStack)
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 — jeden Cloud projekt (stav 2026-05-11)
iwcisgvhwdzztrfdrpkl (aktivní) |
|
|---|---|
| Region | EU Frankfurt |
| Plán | Pro (od 2026-05-15) |
| Kdo používá | Solo dev, produkce zatím bez reálných dat |
| pgvector | Enabled |
| Branching feature | Dostupné (Pro plán) — neaktivováno zatím |
| PITR | 7 dní (Pro plán) |
| Daily backups | Ano (Pro plán) |
Flow migrací (současný stav)
Lokální (supabase start)
│ supabase db reset — testuj migraci
▼
Cloud (`iwcisgvhwdzztrfdrpkl`)
│ supabase db push --linked — aplikuj migraci
✅ Hotovo
Až přijde čas reálných dat (přechod GDPR gate — viz AGENTS.md), workflow se rozšíří o staging vrstvu podle vybrané strategie.
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 (aktuální stav po cleanup 2026-05-11)
| 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 | 512 MB | Sdílená DB (Twenty CRM) |
| redis | redis:7-alpine | 128 MB | Cache (Twenty) |
| twenty | twentyhq/twenty | 2 GB | CRM (správa leadů a kontaktů) |
| twenty-worker | twentyhq/twenty | 1 GB | Background worker pro Twenty |
| bookstack | linuxserver/bookstack | 512 MB | Wiki / znalostní báze |
| bookstack-db | mariadb:11 | 512 MB | BookStack MySQL |
Odstraněno (2026-05-11): n8n, listmonk (viz DEV-LOG).
Služby a URL
| Služba | URL | Účel |
|---|---|---|
| Twenty CRM | crm.sofie.education | Správa leadů a kontaktů |
| BookStack | wiki.sofie.education | Znalostní báze (veřejná + interní) |
| Landing | sofie.education | Rozcestník |
| Docs | docs.sofie.education | Cloudflare Pages (MkDocs) |
Odstraněno: ai.sofie.education (n8n), newsletter.sofie.education (Listmonk).
Reverse proxy: Traefik
Internet → Cloudflare (HTTPS, edge certifikát) → sofie-vm (port 80)
↓ Traefik
crm.sofie.education → Twenty (:3000)
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 (Twenty CRM)
├── redis/ → Redis persistence (Twenty)
├── bookstack/ → BookStack config + uploads
├── bookstack-db/ → MariaDB data
├── landing/ → Landing page HTML
└── backups/ → Database dumps (gitignored)
DNS: Cloudflare
- Doména:
sofie.education(registrovaná u Wedosu, DNS na Cloudflare) - CDN cache, DDoS ochrana zdarma, rychlá propagace DNS změn (~30s)
3. AI: Vertex AI (Gemini)
n8n byl odstraněn (2026-05-11). AI volání jdou přímo z Next.js aplikace přes Vertex AI SDK.
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 Flash — hlavní model (klasifikace, extrakce, běžné odpovědi)
- Gemini Pro — komplexní úlohy (sumarizace, plánování)
- text-embedding-004 — embeddingy pro RAG (pgvector v Supabase — pipeline zatím neimplementována)
Náklady
| Položka | Měsíčně |
|---|---|
VM e2-small + disky + IP |
~$25 |
| Vertex AI (Flash + Pro) | ~$0–10 (MVP, nízký traffic) |
| Supabase | $0 (free tier) |
| Celkem | ~$25–35 |
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í |
| KB obsah | BookStack (MariaDB) | mysqldump na VM | Denně | 30 dní |
| KB soubory | BookStack (/data/bookstack) | GCP disk snapshot | Denně | 14 dní |
| Twenty CRM data | PostgreSQL (twenty DB) | 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 preview.
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 = <prod> ← dnes sdílíme s prod (žádná reálná data)
Až budou reálná data: Preview prostředí potřebuje izolovat data od produkce. Strategie není ještě rozhodnuta (Pro upgrade pro per-branch Supabase preview vs. druhý projekt jako shared staging vs. Docker lokálně). Viz architect-review TBD.
Backend prostředí (dnes)
| Služba | Stav |
|---|---|
| Supabase | Jeden Cloud projekt iwcisgvhwdzztrfdrpkl (Free, EU Frankfurt) |
| BookStack | Jedna sdílená instance na GCP VM |
| Twenty CRM | Jedna sdílená instance na GCP VM |
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 Cloud (sdílený) │
│ Ředitel testuje na preview URL │
└──────────────────┬───────────────────────────────┘
│ merge PR to main
▼
┌──────────────────────────────────────────────────┐
│ PRODUCTION │
│ app.sofie.education ←→ Supabase Cloud │
│ supabase db push --linked │
└──────────────────────────────────────────────────┘
Checklist pro deploy
- Migrace otestovaná lokálně (
supabase db reset) - PR vytvořen, Vercel preview funguje
- Ředitel otestoval na preview URL
- PR merged → Vercel auto-deploy to prod
- Migrace pushnutá na Supabase Cloud (
supabase db push --linked) - Smoke test (třídnice, přihlášení, žáci)
Až přijdou reálná data, checklist přibyde o kroky pro staging vrstvu (TBD).
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.
Monitoring (minimum)
| Nástroj | Co sleduje | Cena |
|---|---|---|
| Uptime Robot | Dostupnost app.sofie.education + 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 |
Feedback loop: učitelé → vývoj
Primární: Google Form (kdo, typ, popis) → Google Sheets → GitHub Issue → dev notifikace.
Metriky úspěchu (za 1 měsíc)
| Metrika | Cíl | Jak měřit |
|---|---|---|
| Učitelé evidují třídnici | Denně (aspoň jeden slot/den) | Supabase: počet classbook_entries |
| Budget | < $35/měs | GCP billing |
| VM RAM utilization | < 80 % | GCP monitoring |
| Vercel build zelená | 100 % | Vercel dashboard |