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.
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.
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 variable | What it does |
|---|---|
IPX_DATABASE_URL | A postgres://user:password@host:5432/database address, to keep everything in Postgres instead of SQLite |
PUID, PGID | The user and group that own the files ipx writes |
TYPESAFE_KEY | The 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_FORMAT | json logs one JSON object a line, for Loki and the like |
OTEL_EXPORTER_OTLP_ENDPOINT | Sends traces of requests, checks and downloads to an OpenTelemetry collector; set WEB_TRACING=on on ipx-web too |
IPX_UPSTREAM | On ipx-web: where ipx is, ipx:8099 by default |
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.
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.