Rondo Docs

Run your own server

Host Rondo on a server of your own, with Docker Compose.

Rondo's servers are open source, and the images that run rondo.matthewsource.com run on a server of yours. One Compose file starts all of it on one port, and the reverse proxy you choose serves that over HTTPS.

What you need

  • A Linux server on x86-64 with Docker and Docker Compose. The images aren't built for ARM yet.
  • A hostname whose DNS points at the server, and a reverse proxy that serves it over HTTPS: Caddy, nginx, Traefik or a Cloudflare Tunnel.
  • An SMTP login to send sign-in codes from. Any mail provider's works.

Start it

Get the Compose file and its settings, from the latest release:

mkdir rondo && cd rondo
curl -fL -O https://raw.githubusercontent.com/sourcelocation/Rondo/v0.1.9/server/compose.yaml
curl -fL -o .env https://raw.githubusercontent.com/sourcelocation/Rondo/v0.1.9/server/.env.example

The settings run Rondo on your own computer as they are. Change every one marked "Self-hosting":

  • RONDO_PUBLIC_URL to https://<your hostname>, RONDO_HOST to the hostname, and COMPOSE_PROFILES to app, so Rondo's own servers start.
  • RONDO_VERSION to nothing, so the images match compose.yaml's release. Remove RONDO_HOOKS_URL, and set ORY_DEV to nothing.
  • The five secrets: make each with openssl rand -hex 32, except KRATOS_CIPHER_SECRET, which must be 32 characters: openssl rand -hex 16.
  • Your SMTP login (uncomment those lines), and your own email address in RONDO_OWNER_EMAIL.
  • Remove RONDO_STAFF_PASSKEY and the development Web Push keys.

Start it:

docker compose up -d --wait

Rondo now answers on http://localhost:23900, on the server only.

Point your reverse proxy at it. With Caddy on the server, which gets the certificate on its own:

/etc/caddy/Caddyfile
<your hostname> {
	reverse_proxy localhost:23900
}

With another proxy, send every path on the hostname to localhost:23900, with its Host and X-Forwarded-* headers.

Open your hostname and sign in with the address in RONDO_OWNER_EMAIL. That account owns the server.

What runs

ServiceWhat it doesPath
webThe web app, and routing each other path to its service/app
apiThe Go server: accounts, sharing, Discover, media, mail/api, /media, /blobs
syncThe sync server, and the MCP server for AI assistants/sync, /mcp
kratosOry Kratos: sign-in/auth
hydraOry Hydra: AI assistants' OAuth/oauth2, /userinfo and OAuth discovery
postgresOne PostgreSQL, with a database each for Rondo, Kratos and Hydra

Pictures and sounds are kept in the media volume. Share links lead into the web app, and /docs leads to these docs.

Using it

  • The web app at https://<your hostname>/app/ works in any modern browser, offline too.
  • The iPhone, iPad, Mac and Android apps sync with rondo.matthewsource.com until you choose otherwise: while signed out, enter https://<your hostname> under Settings › General › Sync › Server, then sign in.
  • Sign-in is by email code or passkey. Google and Apple sign-in aren't set up.
  • AI assistants connect to https://<your hostname>/mcp, as described in AI assistants. For rondo-mcp, set RONDO_URL=https://<your hostname>.

Pro on your server

No billing is set up, so nobody has Pro until you give it. As the owner, open the web app's staff tools at /app/staff/promo, make promo codes, and redeem them. Staff tools ask you to add a passkey first.

To change how much each plan may store, set RONDO_FREE_MEDIA_MB and RONDO_PRO_MEDIA_MB (200 and 10000 by default).

More settings

The Go server reads .env as well, so its other settings go there too:

  • S3-compatible storage in place of the media volume: RONDO_S3_ENDPOINT, RONDO_S3_BUCKET, RONDO_S3_ACCESS_KEY, RONDO_S3_SECRET_KEY and, if your provider needs it, RONDO_S3_REGION.
  • Reminders in browsers (Web Push): RONDO_VAPID_PUBLIC_KEY and RONDO_VAPID_PRIVATE_KEY, which npx web-push generate-vapid-keys makes, and RONDO_VAPID_SUBJECT, a mailto: address of yours.

After changing .env

Run docker compose up -d --force-recreate. Kratos's and Hydra's settings are written from .env, and Compose doesn't notice when they change.

Upgrade

Back up first, download the new release's compose.yaml over the old one (as in Start it), and run docker compose up -d --wait. The database is migrated before the servers start. Keep your .env.

From the tls profile

Compose used to serve HTTPS itself, with the tls profile. It's gone: put a reverse proxy in front of port 23900 (above), change COMPOSE_PROFILES from tls to app, and remove the rondo_edge volume once Rondo answers.

From server/self-host

Rondo used to run from server/self-host, on PostgreSQL 16. Back up there (below) and stop it, move your .env to server/ and change it as above. Start only the database, docker compose up -d postgres, restore into it with docker compose exec -T postgres psql -U rondo -d postgres < rondo.sql (the errors about what already exists are expected), copy the media volume across, and start the rest.

Back up

The database, with Kratos's and Hydra's:

docker compose exec -T postgres pg_dumpall -U rondo > rondo.sql

and the media volume, rondo_media, unless you use S3.

Changing Rondo

Rondo is under the AGPL-3.0: if you change it and let others use it, offer them your changes. A changed Rondo needs a name and logo of its own.

On this page