Nomploy Nomad Packs

← All packs

podfetch v0.1.0

Media

PodFetch — a self-hosted podcast manager and archiver: subscribe to shows, auto-download episodes and stream them from a clean web UI. Deployed as a single host-networked Nomad service (SQLite).

nomad-pack run podfetch --registry nomploy
…or one line (add registry + run)
curl -fsSL https://packs.nomploy.com/install.sh | sh -s -- podfetch

Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.

1 task http 8000 2 volumes image samuel19982/podfetch:latest tracks :latest image bumped today
Variables 11
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run podfetch -f values.hcl --registry nomploy
# The name of the Nomad job.
job_name = "podfetch"

# The Nomad namespace to deploy into.
namespace = "default"

# The datacenters to deploy to.
datacenters = ["*"]

# The PodFetch container image. Pin a tag in production.
image = "samuel19982/podfetch:latest"

# Host port for the PodFetch web UI.
port = 8000

# Public URL where PodFetch is served (used for feed/RSS links).
server_url = "http://localhost:8000"

# How often (minutes) to check subscriptions for new episodes.
polling_interval = 60

# Named volume for downloaded episodes (/app/podcasts).
podcasts_volume = "podfetch_podcasts"

# Named volume for the SQLite database (/app/db).
db_volume = "podfetch_db"

# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []

# The task resources.
resources = {
    cpu    = 500
    memory = 512
  }
NameTypeDefaultDescription
job_name string
"podfetch"
The name of the Nomad job.
namespace string
"default"
The Nomad namespace to deploy into.
datacenters list
["*"]
The datacenters to deploy to.
image string
"samuel19982/podfetch:latest"
The PodFetch container image. Pin a tag in production.
port number
8000
Host port for the PodFetch web UI.
server_url string
"http://localhost:8000"
Public URL where PodFetch is served (used for feed/RSS links).
polling_interval number
60
How often (minutes) to check subscriptions for new episodes.
podcasts_volume string
"podfetch_podcasts"
Named volume for downloaded episodes (/app/podcasts).
db_volume string
"podfetch_db"
Named volume for the SQLite database (/app/db).
constraints list
[]
Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
resources object
{
    cpu    = 500
    memory = 512
  }
The task resources.
Back up this pack

This pack stores data in 2 Docker named volumes: podfetch_podcastspodfetch_db

restic

# Run on the node hosting this pack. Point restic at your repo first:
#   export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>"
#   export RESTIC_PASSWORD="<repo-password>"
#   export AWS_ACCESS_KEY_ID=<key>  AWS_SECRET_ACCESS_KEY=<secret>
restic backup \
  /var/lib/docker/volumes/podfetch_podcasts/_data \
  /var/lib/docker/volumes/podfetch_db/_data

rclone (sync to S3/R2)

rclone sync /var/lib/docker/volumes/podfetch_podcasts/_data backup:<bucket>/podfetch_podcasts
rclone sync /var/lib/docker/volumes/podfetch_db/_data backup:<bucket>/podfetch_db

Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.

Readme

podfetch

PodFetch is a self-hosted podcast manager and archiver. Subscribe to shows (by RSS or via search), let it automatically download new episodes, organise them, and stream everything from a clean web UI or a podcast-app-compatible feed. It's a lightweight single binary backed by SQLite.

This pack runs PodFetch as a single host-networked Nomad service.

Deploy

nomad-pack run podfetch --registry=nomploy --var server_url=http://<node-ip>:8000

Open http://<node-ip>:8000 and add your first podcast.

Configuration

Variable Default Description
image samuel19982/podfetch:latest Container image (pin a tag in production).
port 8000 Host port for the web UI.
server_url http://localhost:8000 Public URL used in generated feed links.
polling_interval 60 Minutes between subscription checks.
podcasts_volume podfetch_podcasts Volume for downloaded episodes (/app/podcasts).
db_volume podfetch_db Volume for the SQLite database (/app/db).
resources 500 MHz / 512 MB CPU and memory for the task.

Episodes and the database persist across restarts. PodFetch is open by default; enable authentication with the BASIC_AUTH/OIDC environment variables if it's reachable beyond a trusted network.