Skip to content

Docker

rpodder provides a multi-stage Dockerfile and a docker-compose.yml with several profiles for different use cases.

Docker Compose profiles

Default (development)

docker compose up -d

Starts PostgreSQL + rpodder in development mode with cargo-watch for live reload. Source code is bind-mounted so changes are picked up automatically.

  • rpodder: http://localhost:3006 (mapped from container port 3005)
  • PostgreSQL: localhost:5432

Release (PostgreSQL)

docker compose --profile release up -d

Production-like build with the full release binary + embedded web UI. Good for testing before deployment.

SQLite

docker compose --profile sqlite up -d
docker compose exec rpodder-sqlite rpodder user create admin admin --admin

Self-contained mode — no external database needed. Data stored in a Docker volume.

Standalone frontend

docker compose --profile frontend up -d

Runs the Svelte SPA in a separate nginx container, with the API backend as a separate service. Useful for custom frontend deployments.

Environment files

Sensitive configuration (OAuth secrets, API keys) can be stored in .env.oauth:

# .env.oauth (gitignored)
RPODDER_OAUTH_ISSUER_URL=https://sso.example.com/application/o/rpodder/
RPODDER_OAUTH_CLIENT_ID=your-client-id
RPODDER_OAUTH_CLIENT_SECRET=your-client-secret
RPODDER_OAUTH_ADMIN_GROUP=admins
RPODDER_BASE_URL=http://localhost:3006
RPODDER_PODCASTINDEX_KEY=your-key
RPODDER_PODCASTINDEX_SECRET=your-secret

Both the rpodder (dev) and rpodder-release services load this file automatically (with required: false, so it's optional).

Dockerfile details

The release Dockerfile is a multi-stage build:

  1. Frontend stage (oven/bun:1): installs dependencies, builds Svelte SPA to web/dist/
  2. Backend stage (rust:bookworm): compiles Rust binary with mold linker for faster builds. Dependencies are cached in a separate layer
  3. Runtime stage (debian:bookworm-slim): ~80MB final image with just the binary, CA certificates, and migrations
# Build with custom tags
docker build \
  --build-arg RPODDER_BUILD_TAG=v1.0.0 \
  --build-arg RPODDER_BUILD_SHA=$(git rev-parse --short HEAD) \
  -t rpodder .

Volumes

Never destroy volumes without checking

The pgdata and sqlite-data volumes contain your podcast database. Never use docker compose down -v unless you want to lose all data.

Volume Profile Purpose
pgdata default, release PostgreSQL data
sqlite-data sqlite SQLite database file
cargo-cache default (dev) Rust dependency cache
target-cache default (dev) Rust build cache

CLI inside Docker

# Create a user (release profile)
docker compose --profile release exec rpodder-release rpodder user create myuser mypass --admin

# Run migrations manually
docker compose --profile release exec rpodder-release rpodder migrate

# Repair FTS5 index (SQLite only)
docker compose --profile sqlite exec rpodder-sqlite rpodder repair