Blog · Deploy guides

How to self-host Ryot in 2026: its Compose file, one command and HTTPS

By the Pethost team · · 8 min read

You want Ryot, the tracker for what you watch, read, play and lift, on a server of your own, with its Postgres, at an address with HTTPS, and without setting up a proxy or certificates. Ryot's docs give a Docker Compose file, and on Pethost a Compose file is a project. Put your address and your own token into it, as Ryot asks, and run pethost deploy. Ryot and its database started in 38 seconds, at an address the deploy gave by itself.

In short
  • The file is Ryot's own: the docker-compose.yml of its installation page, with Ryot and Postgres 18.
  • Two edits, the ones Ryot asks for: your address in FRONTEND_URL and a long random string in SERVER_ADMIN_ACCESS_TOKEN. Nothing is changed for Pethost: the ports and container_name lines stay.
  • One command: pethost deploy. The machine finds the web port the file publishes and serves it at https://ryot.yourname.pethost.app.
  • The data stays: Postgres keeps it in a volume that the nightly backup includes. A new version of Ryot is one changed tag and one deploy.
  • The price: €9.99 a month for a machine of 2 vCPU, 3 GB and 30 GB. Ryot and Postgres took about 310 MB of its memory. There is no free tier.

What you need to self-host Ryot in 2026

Three things: Ryot's Compose file, the pethost command and a Pethost account.

The file is on the first page of Ryot's docs, under “Installation”. Make a folder, whose name becomes the project's name, and save the file there as docker-compose.yml:

mkdir ryot && cd ryot

The command is one program, installed by one line. Every command it has is in the CLI's reference.

curl -fsSL https://pethost.dev/install.sh | sh      # macOS, Linux
irm https://pethost.dev/install.ps1 | iex           # Windows, in PowerShell

The account needs a plan. If you are not signed in, pethost deploy opens your browser and signs you in. If you have no plan yet, it shows you where to choose one, and waits.

Set Ryot's address and token in docker-compose.yml

The service ryot looks like this in the file:

  ryot:
    image: ignisda/ryot:v10 # or ghcr.io/ignisda/ryot:v10
    pull_policy: always
    container_name: ryot
    restart: unless-stopped
    ports:
      - "8000:8000"
    environment:
      - TZ=Europe/Amsterdam
      - FRONTEND_URL=https://ryot.your-domain.com # IP address is fine too
      - DATABASE_URL=postgres://postgres:postgres@ryot-db:5432/postgres # REQUIRED
      - SERVER_ADMIN_ACCESS_TOKEN=28ebb3ae554fa9867ba0 # REQUIRED: set to a long random string

Two lines are yours to set, on any server:

Set TZ to your own timezone while you are there. Nothing else in the file changes. The ports lines, the two container_name lines and the database's volume run as Ryot wrote them.

Deploy Ryot with pethost deploy

Run pethost deploy in the folder. This is the whole screen:

$ pethost deploy
Name it [ryot]:     it will live at https://ryot.sam.pethost.app

✓ Packed 1 file, 877 B
✓ Uploaded straight to your machine
✓ Started in 38 s
  · deployed docker-compose.yml as compose.yaml
✓ ryot listens on 8000 → https://ryot.sam.pethost.app
  It answers 302.

https://ryot.sam.pethost.app

Wrote .pethost (commit it). Next:   pethost logs -f   ·   pethost open

The file publishes port 8000 of ryot. Once the service listened, the machine asked that port what it is, got an answer in HTTP, and gave it the project's address. So the port is served over HTTPS at that address and is not opened on the machine beside it. The answer is 302 because Ryot sends a visitor who is not signed in to its sign-in page.

Postgres publishes no port, so it has no address and nothing of it is open: only Ryot reaches it, by the name ryot-db. That is why the file's database password can stay as it is. This is the project after the deploy:

$ pethost
ryot · https://ryot.sam.pethost.app
ryot	running	since 2026-10-13T15:20:16Z	listens on 3000, 5000, 8000	memory 248 MB
ryot-db	running	since 2026-10-13T15:20:16Z	listens on 5432	memory 64 MB
2 services run · last deploy succeeded 2026-10-13T15:20:17Z

Create your Ryot account

Open the address. A new Ryot has no account: choose “Create a new account” on the sign-in page and pick a username and a password. We did, signed in, and asked /health, which answered 200.

A new Ryot lets anyone who finds the address sign up. Once your own account exists, close that door: add - USERS_ALLOW_REGISTRATION=false to the environment of ryot and run pethost deploy again. We did: the next sign-up was refused, and the first account signed in as before. This is Ryot's own setting, from its configuration page, and it matters on any server that the internet can reach.

Movies, shows and video games need access tokens of their providers, such as TMDB's. They are more lines in the same environment list, and Ryot's configuration page names each.

To use a name of your own, such as tracker.example.com, run pethost domain add tracker.example.com ryot:8000. It prints the one DNS record to make, a CNAME to your machine's name, and the certificate comes by itself once the name resolves. Then put the new name into FRONTEND_URL and deploy.

Where the Ryot data is, and how it is backed up

Ryot keeps accounts, your collections and every progress update in Postgres, and the Compose file gives Postgres a volume. The machine keeps that volume through restarts and deploys, and the nightly backup includes it:

$ pethost volume
ryot (.pethost)
postgres_storage	64 MB	ryot-db:/var/lib/postgresql	backed up 2026-10-13T15:24:14Z

We restarted the project with pethost restart and signed in again with the same account. pethost backup lists the snapshots, and pethost backup restore puts one back. For a look into the database from your laptop, pethost tunnel ryot-db brings its port to localhost without opening it to anyone else.

Update Ryot to a new version

The file's tag is v10, which Ryot moves with every release of that major version. To choose the moment of an update yourself, name a release in docker-compose.yml and deploy again. We went from 10.5.2 to 10.5.3 this way:

    image: ignisda/ryot:v10.5.3
$ pethost deploy
ryot (.pethost)
✓ Packed 2 files · uploaded · started in 10 s
  · deployed docker-compose.yml as compose.yaml
  · kept the project's x-pethost
  It answers 302.
https://ryot.sam.pethost.app

The address stayed, the data stayed, and the account signed in as before. If you keep the moving tag, pethost restart --pull gives Ryot a new container on the newest image of it. Read Ryot's release notes first, and take a snapshot with pethost backup now before a large update: a rollback puts the earlier Compose file back, and a volume's data is not part of a version.

What you get for the price

Pethost is €9.99 a month for everything you host, on 2 vCPU, 3 GB of memory and 30 GB of disk. Ryot and its Postgres took about 310 MB of that memory, so the same machine has room for your other projects, such as an Umami or an RSSHub beside it. There is no fee per project, and the database is part of the same price.

What is already done on it: HTTPS with certificates that renew themselves, nightly backups kept for 14 days, SSH into any container, and a Compose project that runs from its own file. The machine is in the EU and always on, so the app on your phone never waits for a cold start. The plans are on the pricing part of the first page.

What each project takes. The capacity page: every project with its memory, CPU and disk.
The Pethost panel's capacity page: each project with its memory, CPU and disk.

Pethost is the best pick for

  • People who want their tracker on their own server, without looking after the server
  • Solo developers with several small apps and one bill to pay
  • People whose agent deploys for them: Claude Code or Codex deploys the Compose file and reads its logs
  • Families and friends who share one Ryot and keep their data in the EU

Look elsewhere if

  • Your instance serves so many people that it needs a database cluster of its own

Questions

Can I self-host Ryot with Docker Compose without a server to manage?

Yes. On Pethost the Compose file of Ryot's docs is the project: set FRONTEND_URL and SERVER_ADMIN_ACCESS_TOKEN and run pethost deploy. The deploy gives Ryot an address with HTTPS by itself, and the proxy and the backups are already there.

Do I have to change the ports or container_name in Ryot's Compose file?

No. The file publishes port 8000 and names its two containers, and both stay as written. A published port that answers HTTP, as Ryot's does, is served at the project's address over HTTPS and is not opened on the machine. The machine gives the containers names of its own, and Ryot still reaches its database by the service's name, ryot-db.

What is the default Ryot login after a new install?

There is none. A new Ryot has no account: you create the first one on its sign-in page. Set USERS_ALLOW_REGISTRATION=false afterwards so that nobody else can sign up.

How much memory does self-hosted Ryot need?

On our test machine Ryot 10.5.3 took 248 MB and its Postgres 64 MB, with one account and no imports yet. A Starter machine has 3 GB.

How do I update self-hosted Ryot?

Change the image's tag in docker-compose.yml to the new release and run pethost deploy, or keep the tag v10 and run pethost restart --pull. The data in Postgres stays: we went from 10.5.2 to 10.5.3 and signed in as before.

What does it cost to self-host Ryot on Pethost?

€9.99 a month for the Starter machine of 2 vCPU, 3 GB and 30 GB, with no fee per project: the same machine runs your other apps. There is no free tier. Prices are without VAT.

The screens are deploys of the Compose file in Ryot's docs, with Ryot 10.5.3, Postgres 18.6 and pethost 0.2.4, on a test machine of ours. The account in them is the example one, sam.

  1. Ryot: installation
  2. Ryot: configuration
  3. Ryot: deployment
  4. pethost, the command line of Pethost

Put your projects online today

A machine of your own, as many projects as fit, one flat price. Nothing metered, nothing billed on top.

Host all your projects for €9.99/mo