One entry point
An nginx load balancer serves the frontend and round-robins API traffic across every healthy application node. One public port, ready to sit behind the TLS proxy you already run.
Cluster architecture
Iskue starts on a single host and grows sideways: add application nodes when traffic climbs, add database workers when data does. The application doesn't change — only the number of boxes running it.
Add and remove nodes yourself — watch ticket shards rebalance across workers as the data tier expands. This is the same topology the real cluster deployment runs; in production, redistribution is one Citus rebalance command.
What scaling out actually looks like: a real-world week, played out. Follow the steps — or let it run.
Tuesday, 09:00. Two app nodes cruise along under normal load — plenty of headroom.
An nginx load balancer serves the frontend and round-robins API traffic across every healthy application node. One public port, ready to sit behind the TLS proxy you already run.
Sessions are token-based, so any node can serve any request — no sticky sessions, no shared session store. Live board and ticket updates stream over Server-Sent Events from whichever node you landed on.
The data tier is Citus: a coordinator routes queries to worker nodes that hold the sharded ticket data. It's still PostgreSQL — same SQL, same drivers, same tooling.
Dependency-ordered and automatic — one compose command brings up the whole sequence.
Most teams run Iskue on a single Docker host for a long time — the cluster exists for the day that stops being enough. Because sessions are stateless and the data tier is still PostgreSQL, moving from one box to many is an operations change, not a migration project.
A demo takes half an hour. A pilot runs on your servers, with your data, from day one.