Docker¶
rpodder provides a multi-stage Dockerfile and a docker-compose.yml with several profiles for different use cases.
Docker Compose profiles¶
Default (development)¶
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)¶
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¶
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:
- Frontend stage (
oven/bun:1): installs dependencies, builds Svelte SPA toweb/dist/ - Backend stage (
rust:bookworm): compiles Rust binary withmoldlinker for faster builds. Dependencies are cached in a separate layer - 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