Přeskočit obsah

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 16avaxis_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 vstup api.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) → S3 backup-prod/ + týdenní VM snapshot.
  • Redis — efemérní (broker/cache); persistence volitelná.
  • S3 = sdílený Ceph RGW (192.168.1.60); company data v backup-{ico}/, app distribuce v app-<slug>/. Prod používá produkční Ceph klíče (oddělené od dev, šifrované v s3_key_pool / sealed .env).
  • Secrets: .env root:600 (jako dev /etc/avax-apps/<slug>/.env), žádné dev creds, M2M secrets re-issued pro prod.

6. Deploy / promotion flow (stable)

  1. Build na dev/CI → image tag X.Y.Z-count-sha → push do Gitea Container Registry (git.avaxis.cz/avax-apps/<slug>). (Dnes dev jen docker build lokálně — pro prod zapnout CR push, viz TODO.)
  2. Promotion (gated): super_admin/manuálně vybere tag → na prod docker pull + rm -f
  3. run konkrétního tagu (--env-file prod) + alembic (řízeně, se zálohou) + smoke.
  4. Launcher stable: dnes S3 channel pointer (app-avax/channels/stable.json) — zůstává; prod backend = api.avaxis.cz.
  5. 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

  1. Proxmox: vytvoř VM dle §3 (8 vCPU / 24 GB / 100+400 GB / Ubuntu 24.04 / statická IP).
  2. Docker + compose + systemd; avax-postgres (prod) + avax-redis.
  3. Gitea CR: zapnout, pushnout stable image apps + core-api.
  4. /etc/avax-apps/<slug>/.env prod (nové creds, M2M re-issue, prod Ceph S3 klíč).
  5. Pull + run stable tagy + alembic; apps-gateway flip.
  6. NPM: api.avaxis.cz → prod VM + Let's Encrypt.
  7. Smoke E2E (auth → app → DB → S3); zálohy (pg_dump cron + VM snapshot).
  8. 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.