Despliegue

Componentes

  • svitrio-api — la API principal en Go (:8080): /admin/*, /auth/*, contenido público, sitemap, /healthz. Un binario estático distroless (SQLite puro en Go).

  • svitrio-portal-api — una API aislada de portal de cliente (:8081, /portal/*). Un proceso separado a propósito: las rutas de operador nunca se montan, así que un principal de cliente no puede alcanzarlas. Comparte la misma BD.

  • SPA de administración — la consola de operador en SvelteKit, compilada estática y servida por nginx, apuntada a la API mediante VITE_SVITRIO_API en tiempo de compilación.

  • base de datos — SQLite por defecto (un archivo en un volumen); Turso integrado; Postgres/Neon mediante una compilación con plugin.

Nota de compilación: la API depende de un repo hermano gate-go/, así que el contexto de compilación de Docker es el directorio padre que contiene tanto svitrio/ como gate-go/.

cd /path/to/repos    # holds svitrio/ and gate-go/
docker build -f svitrio/deploy/Dockerfile.api -t <registry>/svitrio-api .

Bare-metal

cd api && go build -o bin/svitrio-api ./cmd/svitrio-api
cd ../admin && pnpm install && pnpm build   # pnpm, not npm

export SVITRIO_JWT_SECRET=$(openssl rand -hex 32)
export SVITRIO_SECRETS_KEY=$(openssl rand -base64 32)
export SVITRIO_DB=/var/lib/svitrio/svitrio.db
./bin/svitrio-api                 # migrations run automatically on boot

Sirve la SPA de administración y la API detrás de un proxy inverso en hosts separados (admin. y api.).

Kubernetes

Aplica deploy/k8s/* en orden: namespace → secret (creado imperativamente, nunca a partir de placeholders) → config/PVC/deployments/ingress. TLS mediante cert-manager (un ClusterIssuer letsencrypt; DNS-01 para un comodín). La API se mantiene en 1 réplica con una estrategia Recreate mientras usa SQLite (un volumen RWO no puede ser retenido por dos pods).

Svitrio también incluye un modelo SaaS por inquilino (deploy/tenant/provision.sh) que genera una instancia dedicada con namespace por cliente dimensionada según el plan — reutiliza el patrón, cambia las imágenes/hosts/registro por los tuyos.

Primer operador

No hay script de semilla: despliega, abre la administración, solicita un enlace mágico para tu email y síguelo — el primer usuario registrado se promociona automáticamente a semilla + operador. Luego registra una passkey. Las actualizaciones son recompilar y reiniciar; las migraciones son solo hacia delante e idempotentes, pero haz primero una copia de seguridad de la base de datos.