Platform
System
Saturation
CPU load
no dataMemory
no dataDisk
no dataRedis
no dataMemory · 24h
Disk · 24h
API request latency · 24h
Queue depth
PostgreSQL
- Connections
- no data
- Cache hit
- no data
- Database size
- no data
- Commits/s
- no data
- Rollbacks/s
- no data
- Outbox unpublished
- no data
Slowest statements — database time
Time spent inside PostgreSQL. This is not request latency — it cannot see authorization, tenant scoping or serialization. Statements run by other database roles are not visible here.
Capacity
How much does this box hold?
The rate limiter binds before the hardware does
Measured 30 Aug 2026: throttling starts at 8 concurrent callers, while memory sat at 25%, database connections at 5 of 100, and CPU never became the limit. The configured ceiling is 20/s · 100/10s · 500/60s — a sustained ~8.3 requests per second.
That bucket is shared across every caller, not per client, so it is a platform-wide ceiling and one busy client can throttle everyone else. A bigger box would not move it by a single request.
What breaks first
- 1The rate limiter, at ~8.3 req/sConfigured, shared, and reached long before any resource. Fixing it is a config change, not a purchase.
- 2The per-tenant audit-chain lock, at ~150 req/s of writesMeasured separately on the money path. It is per tenant, and a school chain is one tenant — vertical scaling does not move a lock.
- 3CPU — 2 cores shared by six SSR servers, Postgres and a workerNot yet observed under real load. It is the first HARDWARE limit expected, ahead of memory.
- 4Memory, lastNot the near-term constraint.
Where the memory goes
The six Next.js apps consume 991 MB of 1380 MB of container memory — 72% — while the API, worker, Postgres and Redis together use 389 MB.
It is a fixed tax paid before any user arrives and it does not grow with tenants. So the first upgrade buys headroom for traffic, not for schools — and the cheapest capacity win is not a bigger tier at all.
Measured 30 Aug 2026 · docker stats
Box tiers
| Tier | vCPU | RAM | Disk | Left after portals | Basis |
|---|---|---|---|---|---|
| KVM 1 | 1 | 4 GB | 50 GB | ~1.7 GB | projected· 1 vCPU is the risk, not RAM |
| KVM 2current | 2 | 8 GB | 100 GB | ~5.7 GB | measured 30 Aug 2026· current — confirmed from the Hostinger API |
| KVM 4 | 4 | 16 GB | 200 GB | ~13.7 GB | projected· first tier with real SSR headroom |
| KVM 8 | 8 | 32 GB | 400 GB | ~29.7 GB | projected· far beyond anything measured |
⚠️ Only the KVM 2 row is measured. Every other row is arithmetic from published specs and has never been run — treat it as a starting point for a test, not as a result.
Growth to exhaustion
- Disk
- no data
- Database
- no data
- Connections
- no data
Sawtooths weekly: Docker build cache accumulates ~12 GB per deploy and a Sunday cron reclaims it. Judge it on the peak, never on a spot reading.
2 tenants and 48 students. Far too small to extrapolate a per-student cost from — that needs a seeded load test, not arithmetic.
Never approached under load. Not a constraint at this scale.