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_APIen 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 bootSirve 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.