TinyCld is one container plus a small persistent volume for its
database. Pick a managed host for a click-and-go setup, or run it
yourself on any Linux box with no platform markup.
01
One-click hosted
A button, an account, a running server. Both attach a
persistent volume so your data survives restarts.
Render
Blueprint-driven. Render reads render.yaml,
provisions the service and a persistent Disk, and terminates
HTTPS for you.
Needs a paid instance (~$7/mo) — a Disk
can't attach to Render's free tier, and the database lives on
the Disk.
Railway
Deploy the public image with a Volume mounted for the
database. Railway gives you an HTTPS domain that proxies
straight to the container.
From ~$5/mo (Hobby). The one-time $5
trial credit — and trial volumes — expire.
02
Fly.io
The strongest storage story — Volumes, distributed SQLite
via LiteFS, S3 uploads via Tigris. No button; a short CLI
flow.
The fly.toml
mounts the volume at the database path and sets up the health
check. A single volume is single-region — perfect for SQLite, and
a single point of failure until you add LiteFS replicas.
03
Self-host — no platform markup
Any Linux box with Docker. A Hetzner CX-class VM runs
TinyCld for a small team at around €4/month.
# on any Linux VM with Docker$ mkdir tinycld && cd tinycld
$ curl -O https://raw.githubusercontent.com/tinycld/tinycld/main/docker-compose.yml
$ docker compose up -d
✓ ready · https://mail.example.org
Full walkthrough in the
installation guide — autocert
HTTPS, recommended providers, backups. Or run it under a
self-hosted PaaS (Coolify, CapRover, Dokploy) using the same
compose file.
04
Bare metal — no Docker
A native systemd service, built from source on
the host. No container runtime, no reverse proxy — the app
terminates TLS itself via autocert and binds :80/:443
directly.
These scripts are a starting-point example.install.sh and build.sh assume a
Debian/Ubuntu host on x86-64 and that the app owns :80/:443. Most
setups need edits — a different distro or package manager, an ARM
box, or putting TinyCld behind an existing reverse proxy or load
balancer. Read them before you run them, and adapt them to your
environment.
install.sh
installs the toolchain, creates a service user, builds from source
via build.sh,
writes the systemd unit, and starts it. Re-run it (or
build.sh alone) to rebuild and restart on update — the
box keeps the full Node + Go toolchain, since the in-app package
installer rebuilds on the host. Details in the
bare-metal README.