Self-hosting quick start

This guide gets Rosella Rhythm running on your own machine with Docker. No programming knowledge needed — you will copy two small files, run one command, and open the app in your browser.

What you need

  • A machine that is on when you want to use the app: a home server, a NAS that can run containers, a Raspberry Pi–class box, or a small VPS.

  • Docker with the Compose plugin (docker compose version should print a version). Most NAS container managers and any fresh Docker install already include it.

That’s it. The app ships as a single container image and brings its own database (PostgreSQL) alongside it.

Step 1 — create a folder with two files

Make a folder for the app (for example rosella/) and put these two files in it.

docker-compose.yml — describes the two containers (the app and its database):

# Rosella Rhythm — self-host stack: the app + its own PostgreSQL.
# Put a DB_PASSWORD in a .env file next to this, then: docker compose up -d
name: rosella

services:
  app:
    image: ghcr.io/ofbirds/thosedaysapp:latest
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      DB_HOST: postgres
      DB_PORT: "5432"
      DB_NAME: thosedays
      DB_USER: thosedays
      DB_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD in .env}
    ports:
      - "8080:8080"

  postgres:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: thosedays
      POSTGRES_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD in .env}
      POSTGRES_DB: thosedays
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U thosedays -d thosedays"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  pgdata:

.env — holds the one secret you must choose yourself, the database password:

DB_PASSWORD=pick-a-long-random-password
The password is only used between the app and its own database container. You won’t have to type it again — but keep the .env file around, the database needs the same password every start.

Step 2 — start it

From inside the folder, run:

docker compose up -d

The first start downloads the images (a minute or two on a normal connection). Check that both containers are up:

docker compose ps

You should see app and postgres with status running / healthy.

Step 3 — open the app

In a browser on the same network, open:

http://<address-of-your-machine>:8080

You should see the Rosella Rhythm login screen. Register an account, log some period dates, and the calendar and predictions light up from there.

The app is now reachable on your local network only. If you want to use it from anywhere (e.g. on your phone away from home), put it behind a reverse proxy with HTTPS — any of the usual suspects (Caddy, nginx proxy manager, Traefik) works; point it at port 8080.

Optional: email reminders

Rosella Rhythm can email you before a predicted period and when a new version ships. Both are opt-in and need an SMTP account (a Gmail address with an app password works). Add the SMTP settings to your .env and environment — see the configuration reference for the exact variables.

Updating

New releases are announced on the GitHub releases page (and by email, if you opted in). To update:

docker compose pull
docker compose up -d

Your data lives in a Docker volume, not in the container, so updates never touch it. Database schema changes are applied automatically on startup.

Backing up

Everything worth keeping is in the PostgreSQL volume. A simple backup is one command (run it from the app folder):

docker compose exec postgres pg_dump -U thosedays thosedays > rosella-backup.sql

Run that on a schedule (cron, Task Scheduler, your NAS’s backup tool) and copy the file somewhere safe. To restore onto a fresh install:

docker compose exec -T postgres psql -U thosedays thosedays < rosella-backup.sql