Pulling from GHCR
Image tags, what's inside, and how to pin a version for production.
Cariosan's server is published as a Docker image to GitHub Container Registry at ghcr.io/cariosan/server. This page documents what's available, how to choose a tag, and what's inside the image.
Quick pull
For production, pin a specific version so an upstream release doesn't change behavior under you:
Tag policy
| Tag pattern | Promise | Use when |
|---|---|---|
latest | Latest stable release. Updates when we ship. | Local dev, evaluating Cariosan. |
vX.Y.Z (e.g. v0.1.0) | Exact semver release. Frozen forever. | Production. |
vX.Y (e.g. v0.1) | Tracks the latest patch in that minor. Updates when we ship a v0.1.1. | Production if you want auto-patch fixes without changing minors. |
main | Latest commit on the main branch. Unstable. Compiles but may have unmerged-feature regressions. | Never in production. CI experiments only. |
pr-NN | Per-pull-request preview build. | Reviewing a PR locally. |
Always prefer vX.Y.Z or vX.Y in production. latest is fine for development but means an unattended docker compose pull could land you on a new major version.
What's inside
The image is a multi-stage build that ends on a distroless base for a minimal attack surface.
- Base image:
gcr.io/distroless/static-debian12:nonroot - Architectures:
linux/amd64andlinux/arm64(manifest list — Docker picks the right one for you) - Size: ~25 MB compressed, ~30 MB extracted
- Entrypoint:
/cariosan - Default command:
/cariosan(runs the HTTP/WS server) - Healthcheck: built-in via
/cariosan healthcheck. Docker Compose'shealthcheck:directive can call it directly.
What's NOT in the image
- No
sh,bash,curl, orapt— distroless. Usedocker compose execagainst a sidecar if you need an interactive shell. - No Postgres or Redis — those run alongside, see docker-compose.
- No TLS termination — front the server with Caddy, nginx, or a load balancer.
Verifying the image
Every release is signed via cosign with a keyless OIDC signature backed by GitHub Actions.
A successful verification confirms the image was built by the official Cariosan GitHub repository in a GitHub-hosted runner — not pushed manually by someone holding a leaked credential.
Common operations
Run a single container (smoke test)
For a complete stack with Postgres, Redis, and MinIO wired in, use the docker-compose template.
Inspect the binary version
Prints the version + build SHA.
Run the bootstrap CLI
CLI is built into the same binary — no separate image.
Migrating tags in production
When upgrading from vX.Y.Z to a newer minor, read the changelog for breaking changes first. Then in your docker-compose.yml:
Pull + recreate:
The server applies pending database migrations on boot.
Next steps
- Docker Compose template — production-ready compose with Postgres, Redis, MinIO, Caddy
- Environment variables — every
CARIOS_*knob the server respects - Operations — backups, monitoring, log shipping
- Performance tuning
Was this page helpful?