Install ipx and ipx-web

iPX is two containers: ipx, which checks your podcasts, downloads them and answers the API, and ipx-web, which serves the page and passes the API on to ipx.

You need Docker with Compose. There are no published images yet, so you build both from the source:

git clone https://git.sdf1.net/rays/ipx.git
cd ipx
docker build -t ipx .
docker build -f Dockerfile.web -t ipx-web .

The repository has a sample docker-compose.yml that runs both, with the database in SQLite and everything ipx keeps in three folders beside the file:

services:
  ipx:
    image: ipx
    container_name: ipx
    restart: unless-stopped
    environment:
      PUID: "99"          # who owns the files it writes
      PGID: "100"
      TZ: "UTC"
    ports:
      - "6881:6881/tcp"   # BitTorrent
      - "6881:6881/udp"
    volumes:
      - ./config:/config  # config.toml, written on first start
      - ./data:/data      # the database
      - ./downloads:/downloads

  ipx-web:
    image: ipx-web
    container_name: ipx-web
    restart: unless-stopped
    environment:
      IPX_UPSTREAM: "ipx:8099"
    ports:
      - "8099:8080"       # the page
    depends_on:
      - ipx
docker compose up -d

ipx has no port of its own: everything reaches it through ipx-web, on port 8099. Open http://<your server>:8099 and sign in as admin with the password ipodderx, then change it:

echo -n 'a good password' | docker exec -i ipx ipx user passwd admin

The password is read from what you pipe in, so it stays out of your shell's history.

Adding people

An admin adds people in Admin, Accounts, or from the command line:

echo -n 'their password' | docker exec -i ipx ipx user add sam

Each person starts with no podcasts and subscribes to their own. Two people subscribing to the same show cost nothing extra: it is fetched once and each file is kept once.

Settings

How often podcasts are checked, how much disk to use, how many new episodes to download and the rest are in Admin on the page, and take effect straight away. /config/config.toml holds only what ipx needs before it can read its database: where downloads go, BitTorrent, and who gets in.

Environment variableWhat it does
IPX_DATABASE_URLA postgres://user:password@host:5432/database address, to keep everything in Postgres instead of SQLite
PUID, PGIDThe user and group that own the files ipx writes
TYPESAFE_KEYThe server's own typesafe.ai API key: it picks a podcast's Directory category and a Signal's icon, and, when an admin turns it on, pays for everyone's Signals
IPX_LOG_FORMATjson logs one JSON object a line, for Loki and the like
OTEL_EXPORTER_OTLP_ENDPOINTSends traces of requests, checks and downloads to an OpenTelemetry collector; set WEB_TRACING=on on ipx-web too
IPX_UPSTREAMOn ipx-web: where ipx is, ipx:8099 by default

Reaching it from outside

The page is plain HTTP. If anyone will reach it from outside your network, put HTTPS in front of it: a reverse proxy you already run, or a Cloudflare tunnel. People can then sign in through Cloudflare Access or Authentik instead of a password; single sign-on says how.

Updating

git pull
docker build -t ipx .
docker build -f Dockerfile.web -t ipx-web .
docker compose up -d

Your podcasts, accounts and downloads are in the three folders and are kept.