| ID | iomodel.studio |
|---|---|
| Description | The application (web UI and API). |
| Key | studio |
| Type | deployment |
IOModel Studio is the application itself — the Next.js web UI and the API that backs it. It is the component users actually interact with, and the hub that talks to every other service in the stack.
Role in the stack
Studio reads and writes to PostgreSQL, caches in Redis, authenticates users via Keycloak, and mints short-lived WebSocket tokens for the Yjs Realtime Server.
| Setting | Purpose |
|---|---|
DATABASE_URL | PostgreSQL connection string |
REDIS_URL | Cache / coordination endpoint |
AUTH_KEYCLOAK_ISSUER | OIDC issuer for sign-in |
AUTH_URL | Public origin of the deployment |
COLLAB_JWT_SECRET | Signs realtime WS tokens for the Yjs server |
Because Studio is stateless, the only real concern is wiring it to its dependencies and running database migrations before traffic arrives.
A horizontally scalable Deployment behind a Service, with a one-shot
migration Job:
apiVersion: apps/v1
kind: Deployment
metadata:
name: studio
namespace: iomodel
spec:
replicas: 2
selector: { matchLabels: { app: studio } }
template:
metadata: { labels: { app: studio } }
spec:
containers:
- name: studio
image: iomodel/studio:latest
ports: [{ containerPort: 3200 }]
envFrom: [{ secretRef: { name: studio-env } }]
readinessProbe:
httpGet: { path: /api/health, port: 3200 }Apply the migration Job (or an init container) so the schema is ready before
pods serve traffic.
Apply the Deployment and Service; scale replicas to match load.
Route external / traffic to the studio service (see the Reverse Proxy guide).
Migrate before serving
Always run database migrations before new Studio replicas accept traffic. Use
order: start-first (Swarm) or readiness probes (Kubernetes) for
zero-downtime rollouts.
1 incoming link · 4 outgoing links · 2 workflows
| Source object | Label | Link type | Relation | Raw id | Required | Description | |
|---|---|---|---|---|---|---|---|
| routes HTTPS to | — | links | iomodel.studio | — | — |
| Target object | Label | Link type | Relation | Raw id | Required | Description | |
|---|---|---|---|---|---|---|---|
| reads / writes | — | links | iomodel.postgres | — | — | ||
| caches in | — | links | iomodel.redis | — | — | ||
| authenticates via | — | links | iomodel.keycloak | — | — | ||
| mints WS tokens for | — | links | iomodel.yjs_server | — | — |
| Workflow | Model | Participant id | Participant label |
|---|---|---|---|
| Release upgrade release-upgrade | deployment | iomodel.studio | IOModel Studio |
| User sign-in sign-in | deployment | iomodel.studio | IOModel Studio |
apiVersion: apps/v1
kind: Deployment
metadata:
name: studio
namespace: iomodel
spec:
replicas: 2
selector: { matchLabels: { app: studio } }
template:
metadata: { labels: { app: studio } }
spec:
containers:
- name: studio
image: iomodel/studio:latest
ports: [{ containerPort: 3200 }]
envFrom: [{ secretRef: { name: studio-env } }]
readinessProbe:
httpGet: { path: /api/health, port: 3200 }