Install TinyCld

TinyCld is one Docker container. You run it on any Linux server with Docker installed; it gets an HTTPS certificate from Let’s Encrypt automatically, stores its data in a single directory, and updates with docker compose pull && docker compose up -d.

The actual install is the same on every host:

mkdir tinycld && cd tinycld
curl -O https://raw.githubusercontent.com/tinycld/tinycld/main/docker-compose.yml
# edit docker-compose.yml: set SERVE_ON_DOMAINS to your domain
docker compose up -d

What changes between hosting providers is how you get the server itself. The sections below walk through the recommended providers. If you already have a Linux box with Docker, skip to On your own server.

Before you start

You need:

You do not need:

What the container needs

On your own server

If you already have a Linux VM with Docker and a domain pointed at it:

mkdir tinycld && cd tinycld
curl -O https://raw.githubusercontent.com/tinycld/tinycld/main/docker-compose.yml

Open docker-compose.yml in your editor and set your domain:

environment:
    SERVE_ON_DOMAINS: "tinycld.example.com"

Start it:

docker compose up -d
docker compose logs -f

Once you see server started, visit https://tinycld.example.com/setup. Jump to First-run setup.

Each of these runs Docker well and has first-party guides for getting the engine installed on Ubuntu. Follow their setup, then return here and jump to On your own server.

Hetzner

Cheapest serious hosting in the world right now. A CX22 (2 vCPU, 4 GB RAM, 40 GB disk) is about €4/month and comfortably handles TinyCld for a small team. No ingress/egress charges up to 20 TB/month. US and EU data centers priced identically.

tinycld.org itself runs on a Hetzner CPX11 (2 vCPU AMD, 2 GB RAM, 40 GB disk, ~€4.35/month) and handles the marketing site, docs, and a demo instance without breaking a sweat.

Setup guide: Docker CE on Hetzner Cloud.

DigitalOcean

The most familiar dashboard for VPS newcomers. A $6/month Basic Droplet handles TinyCld well.

Setup guide: Docker hosting on DigitalOcean.

Linode (Akamai)

Notably patient support for beginners. The $5/month Nanode handles a solo TinyCld install fine; bump to $10/month for a team.

Setup guide: Docker guides on Linode Marketplace.

After the Docker engine is up

Whichever provider you picked, once you have a Linux VM with Docker installed and your domain’s A record pointed at its public IP, the rest is identical:

  1. SSH into the VM.
  2. Follow On your own server.

Other providers

TinyCld runs on any Linux host with Docker 20.10+. Providers not covered above that also work fine:

The process is always the same: get a Linux machine with a public IP, install Docker, add a DNS A record, run the compose file.

First-run setup

Once the container is running and your domain resolves, visit https://<your-domain>/setup. On first boot there’s no admin account yet, so TinyCld generates a one-time setup token and prints it to the container logs:

docker compose logs tinycld | grep -A 5 'First run'

You’ll see something like:

┌──────────────────────────────────────────────────────────────┐
│ First run setup, visit below URL to configure tinycld:       │
│                                                              │
│ https://tinycld.example.com/setup?token=a1b2c3d4e5f6...      │
└──────────────────────────────────────────────────────────────┘

Open the URL with the token. The wizard collects four fields:

FieldDefaultDescription
Application nametinycldShows in emails and the admin UI.
Email-Your superuser account email.
Password-At least 10 characters.
App URLCurrent originThe public URL, used in outgoing links.

After submitting, you’re logged in as the superuser and land on the setup dashboard. Create your first organization, add packages, and you’re done.

Updates and backups

Updating

cd tinycld
docker compose pull
docker compose up -d

The container restarts in place. Downtime is typically under ten seconds. Migrations run automatically on boot.

Backups

The entire state is in pb_data/. A nightly cron is enough for most people:

0 3 * * * cd /root/tinycld && tar -czf "/root/backups/tinycld-$(date +\%F).tgz" pb_data/

Ship the resulting tarballs off-site (rsync, rclone to S3/B2/Backblaze, or a managed backup tool).

Restoring

Stop the container, replace pb_data/, restart:

docker compose down
rm -rf pb_data
tar -xzf tinycld-2026-04-20.tgz
docker compose up -d

Next steps