Hosts and certificates
Operators
This section is for the people who install and run ulams: a multi-tenant Laravel API with an H5P service, a PDF renderer, an admin panel and a learner front, backed by PostgreSQL, a Redis-protocol server (Valkey) and S3-compatible object storage.
Start here
Section titled “Start here”RequirementsServer sizing (estimates), OS, Docker and DNS.
Self-hosting on one serverStep by step with the published GHCR images, Docker Compose and Caddy.
Install on a VPS with CloudflareThe reference production install: one VPS, Cloudflare tunnel, DNS, TLS and R2, with scripts, costs and backups.
Install on MyDevilThe API on shared hosting with cron workers, Cloudflare in front: what works and what does not.
EnvironmentHow configuration reaches each container, by category.
High availabilityWhat is stateless, what is not, and a reference topology.
Run it
Section titled “Run it”Tenants and users
Data
Day 2
The pieces
Section titled “The pieces”| Container | Image | Role | State |
|---|---|---|---|
api |
ghcr.io/ulams-dev/api |
Laravel API (php-fpm on port 9000), Horizon, tenant queue workers, scheduler | Laravel storage/ (keys, logs, local disks), generated env files |
h5p |
ghcr.io/ulams-dev/h5p |
H5P player, editor and content API (GPL-3.0-or-later) | Installed libraries in /data/libraries |
pdf |
ghcr.io/ulams-dev/pdf |
PDF renderer for certificates | None |
web |
ghcr.io/ulams-dev/web |
Learner front (Astro SSR, port 4321) | None (in-memory cache) |
admin |
ghcr.io/ulams-dev/admin |
Admin and author panel (static build on unprivileged nginx, port 8080) | None |
front |
ghcr.io/ulams-dev/front |
The older React learner front, optional | None |
| PostgreSQL | upstream | Platform database plus one database per tenant | Yes |
| Valkey | upstream | Queues, cache, locks, H5P caches | Queues (persist it) |
| Object storage | any S3-compatible service | Platform bucket plus one bucket per tenant | Yes |
| Caddy | upstream | TLS, routing by host, content origins, CSP headers | Certificates |
The architecture is explained for developers in Architecture and Tenancy; image details are in Container images.