Spec: Produkční VM server (stable) na Proxmoxu¶
Rozhodnuto 2026-06-18 (Michal): dvouprostředí — alpha → dev (avaxdev), stable → dedikovaný produkční VM. Stable channel (launcher + per-app backendy) se publikuje na prod, dev zůstává pro alpha/integraci. Spec = parametry serveru + architektura + deploy/promotion flow + bring-up.
1. Model: dvě prostředí¶
| dev (avaxdev) | prod (nový VM) | |
|---|---|---|
| Účel | alpha, integrace, CI build | stable, zákazníci |
| Deploy | push do master → auto-deploy (hostname guard) | gated/manuální promotion (NE push-trigger) |
| Zdroj image | docker build na avaxdev runneru |
Gitea Container Registry (image z dev CI) → pull |
| URL | 192.168.1.56:8000 (interní) |
api.avaxis.cz (přes NPM proxy + TLS) |
| Data | avaxis_dev (smí se měnit) | avaxis_prod (oddělená, zálohovaná) |
| Stabilita | smí padat | SLA, monitoring, zálohy |
Princip promotion: image se postaví+otestuje na dev (CI) → tagne → publikuje do
Gitea CR → na prod se gated/manuálně stáhne konkrétní tag + docker rm -f + run
(NE docker restart, NE :latest). Žádný push-trigger na prod (strukturálně mimo).
Datové ops (migrace) na prod = gated, ručně/řízeně, se zálohou předem.
2. Co na prod VM běží¶
- Platform backend (
core-api, FastAPI) — auth, katalog, RBAC, store, M2M, apps-gateway, tenancy, storage STS. - Per-app backend kontejnery (stable verze):
avax-app-<slug>(app-payments, app-hotline, app-kontakty, app-doklady, app-farma, app-stavebni, app-konverze, apz-runner, app-legal, app-ai-helper…) + jejich workery (Celery). - PostgreSQL 16 —
avaxis_prod(per-app schémata + tenant schémata). - Redis — broker/pubsub (Celery, entitlement/companies pubsub).
- nginx / apps-gateway —
/apps/<slug>/*routing (za NPM proxy).
Co NEběží na prod (záměrně):
- Gitea Actions runner (build je na dev; prod jen pull z CR) — žádný build na prod.
- GPU/AI inference — offloaded na gerry (GPU farma), prod jen klient přes app-ai-helper.
- MinIO lokálně — S3 je externí Ceph RGW (192.168.1.60:7480 / s3.avaxis.cz).
- Dev tooling, scratch, .tmp.
3. Parametry VM (Proxmox)¶
Dimenzováno z dev baseline (avaxdev: 16 vCPU / 11 GB RAM / 73 GB — reálně 3 GB RAM used, ale disk 98 % plný z 52.9 GB Docker images; Postgres 4.3 GB / 15 schémat, ~20 kontejnerů) + rezerva na růst (více firem, tenant schémata, stable+rollback image).
| Parametr | Doporučení | Proč |
|---|---|---|
| vCPU | 8 (host CPU type, ne QEMU generic) | Apps jsou FastAPI (lehké); dev 16 vCPU jede pod 20 %. 8 s rezervou; Proxmox dovolí navýšit. |
| RAM | 24 GB (min 16) | Dev používá ~3 GB při nízké zátěži; prod = Postgres cache + ~15 app kontejnerů + Redis + workery + headroom. 24 GB komfort. |
| Disk OS+app | 100 GB | Systém + Docker images (dev má 52.9 GB!) + logy. |
| Disk data | 400 GB NVMe/SSD (oddělený disk/volume) | Postgres (/var/lib/... — DB roste z 4 GB na desítky; NVMe kvůli IO), per-app data, zálohy. Oddělené od OS = snadný snapshot/rozšíření. |
| Síť | 1 Gbps, statická LAN IP (např. 192.168.1.5x) |
Dosažitelná z NPM (.24), Ceph RGW (.60), gerry (GPU). Veřejně JEN přes NPM (TLS). |
| OS | Ubuntu 24.04 LTS | Konzistence s dev; docker + systemd. |
| Proxmox | qcow2/ZFS, snapshot před promotion, host CPU type |
Snapshot = instant rollback celé VM. |
Disk je #1 lekce z dev (98 % plno). Prod: ample disk + cron
docker image prune+ retention image (drž jen N posledních tagů per app pro rollback).
4. Síť / DNS / TLS¶
api.avaxis.cz→ NPM (.24) → prod VM:80(nginx/apps-gateway) nebo:8000(core-api). TLS = NPM Let's Encrypt (jako ostatní*.avaxis.cz).- Per-app veřejné:
/apps/<slug>/*přes apps-gateway (jeden vstupapi.avaxis.cz), NE subdoména per app (méně certů). - DNS: zatím netřeba (NPM + existující
*.avaxis.cz); až bude potřeba, DNS host „hukot". - Firewall: ven jen 80/443 přes NPM; SSH jen z LAN/klíč; DB/Redis jen interně (loopback/docker net).
5. Data + zálohy¶
- PostgreSQL
avaxis_prod— oddělená instance (ne sdílená s dev). Per-app + tenant schémata. Zálohy: dennípg_dump(per-DB) → S3backup-prod/+ týdenní VM snapshot. - Redis — efemérní (broker/cache); persistence volitelná.
- S3 = sdílený Ceph RGW (
192.168.1.60); company data vbackup-{ico}/, app distribuce vapp-<slug>/. Prod používá produkční Ceph klíče (oddělené od dev, šifrované vs3_key_pool/ sealed.env). - Secrets:
.envroot:600 (jako dev/etc/avax-apps/<slug>/.env), žádné dev creds, M2M secrets re-issued pro prod.
6. Deploy / promotion flow (stable)¶
- Build na dev/CI → image tag
X.Y.Z-count-sha→ push do Gitea Container Registry (git.avaxis.cz/avax-apps/<slug>). (Dnes dev jendocker buildlokálně — pro prod zapnout CR push, viz TODO.) - Promotion (gated): super_admin/manuálně vybere tag → na prod
docker pull+rm -f runkonkrétního tagu (--env-file prod) + alembic (řízeně, se zálohou) + smoke.- Launcher stable: dnes S3 channel pointer (
app-avax/channels/stable.json) — zůstává; prod backend =api.avaxis.cz. - Rollback: předchozí tag držený v CR + VM snapshot.
7. Bezpečnost / hardening (prod gate)¶
- ✅ caller→app binding (tenancy) — hotovo.
- ⏳ reálná scoped STS (RGW STS na Ceph
.60) — gate před klientskými fin. daty (Fáze 2). - TLS všude (NPM), HSTS; žádný plaintext secret; rotace creds (M2M, S3) — princip „co se mihne, rotuje se".
- Monitoring (health, disk!, DB), alerty; oddělené prod role/uživatelé v DB.
8. Bring-up checklist¶
- Proxmox: vytvoř VM dle §3 (8 vCPU / 24 GB / 100+400 GB / Ubuntu 24.04 / statická IP).
- Docker + compose + systemd; avax-postgres (prod) + avax-redis.
- Gitea CR: zapnout, pushnout stable image apps + core-api.
/etc/avax-apps/<slug>/.envprod (nové creds, M2M re-issue, prod Ceph S3 klíč).- Pull + run stable tagy + alembic; apps-gateway flip.
- NPM:
api.avaxis.cz→ prod VM + Let's Encrypt. - Smoke E2E (auth → app → DB → S3); zálohy (pg_dump cron + VM snapshot).
- Cutover launcher backend URL →
api.avaxis.cz.
9. Otevřené otázky¶
- IP prod VM (
192.168.1.5x?) + Proxmox node. - Gitea Container Registry — zapnout (dnes se image jen buildí, nepushuje do CR).
- Sdílený vs oddělený Ceph pro prod (zatím sdílený
.60, prod klíče). - vm-api hostname / convention.