SpecsModelExplore
Overview
IOModel Stack
Reverse ProxyIOModel StudioYjs Realtime ServerKeycloakPostgreSQLRedis
SpecsModelExplore
IOModel Stack
OverviewStack GuideLinks and Communications
IDiomodel
DescriptionSelf-hosted IOModel deployment (default Docker Compose / Kubernetes stack).
Keyiomodel
Typenamespace
Table of contents
Stack Guide
Components at a glance
Why it's structured this way
Deploying the whole stack

Stack Guide

The IOModel Stack is the complete self-hosted deployment of IOModel: a web application, its realtime collaboration backend, an identity provider, a relational database, and a cache — all sitting behind a single TLS-terminating edge.

What this namespace represents

This object is a logical grouping (namespace) for everything that ships in one deployment unit. On Kubernetes it maps to a Namespace; with Docker Swarm it maps to a single stack.

Components at a glance

ComponentRoleWorkload type
Reverse ProxyTLS termination, HTTP/WS routingIngress / edge
IOModel StudioWeb UI + APIStateless Deployment
Yjs Realtime ServerLive collaboration over WebSocketStateless Deployment
KeycloakIdentity provider / SSO (optional)Deployment
PostgreSQLApplication databaseStateful (StatefulSet)
RedisCache & coordinationStateful (StatefulSet)

Why it’s structured this way

  • Stateless vs stateful — Studio and the Yjs server hold no durable state, so they scale horizontally. PostgreSQL and Redis own the state and are deployed as StatefulSets with persistent volumes.
  • One entry point — all external traffic enters through the reverse proxy, which keeps TLS, routing, and rate limiting in one place.
  • Pluggable identity — Keycloak is bundled for convenience but can be swapped for any OIDC-compatible provider.

Deploying the whole stack

Group everything under one namespace and deploy components independently:

kubectl create namespace iomodel
kubectl -n iomodel apply -f k8s/
apiVersion: v1
kind: Namespace
metadata:
  name: iomodel
  labels:
    app.kubernetes.io/part-of: iomodel-stack

Stateful components (postgres, redis) use StatefulSets with volumeClaimTemplates; stateless components (studio, yjs_server, keycloak) use Deployments fronted by Services and an Ingress.

Change defaults before exposing the stack

The bundled secrets (database password, Keycloak admin, JWT secrets) are for local use only. Set strong secrets, a real public origin, and TLS before exposing the deployment to a network.

kubectl create namespace iomodel
kubectl -n iomodel apply -f k8s/
apiVersion: v1
kind: Namespace
metadata:
  name: iomodel
  labels:
    app.kubernetes.io/part-of: iomodel-stack