Nomploy Nomad Packs

← All packs

ytptube v0.1.0

Media

YTPTube — a web UI and scheduler for yt-dlp: queue downloads, use presets and channel subscriptions, and grab video/audio from thousands of sites. Deployed as a single host-networked Nomad service.

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

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

2 tasks http 8081 2 volumes image ghcr.io/arabcoders/ytptube:latest tracks :latest image bumped today
Variables 9
values.hcl

Save as values.hcl, edit, then run:

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

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

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

# The YTPTube container image. Pin a tag in production.
image = "ghcr.io/arabcoders/ytptube:latest"

# Host port for the YTPTube web UI.
port = 8081

# Named volume mounted at /config (settings, presets, queue database).
data_volume = "ytptube_data"

# Named volume mounted at /downloads — downloaded media (files + tmp).
downloads_volume = "ytptube_downloads"

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

# The task resources.
resources = {
    cpu    = 300
    memory = 256
  }
NameTypeDefaultDescription
job_name string
"ytptube"
The name of the Nomad job.
namespace string
"default"
The Nomad namespace to deploy into.
datacenters list
["*"]
The datacenters to deploy to.
image string
"ghcr.io/arabcoders/ytptube:latest"
The YTPTube container image. Pin a tag in production.
port number
8081
Host port for the YTPTube web UI.
data_volume string
"ytptube_data"
Named volume mounted at /config (settings, presets, queue database).
downloads_volume string
"ytptube_downloads"
Named volume mounted at /downloads — downloaded media (files + tmp).
constraints list
[]
Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
resources object
{
    cpu    = 300
    memory = 256
  }
The task resources.
Back up this pack

This pack stores data in 2 Docker named volumes: ytptube_dataytptube_downloads

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/ytptube_data/_data \
  /var/lib/docker/volumes/ytptube_downloads/_data

rclone (sync to S3/R2)

rclone sync /var/lib/docker/volumes/ytptube_data/_data backup:<bucket>/ytptube_data
rclone sync /var/lib/docker/volumes/ytptube_downloads/_data backup:<bucket>/ytptube_downloads

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

ytptube

YTPTube — a web UI and scheduler for yt-dlp. Queue and manage downloads, save format/quality presets, subscribe to channels/playlists for automatic grabs, and pull video or audio from thousands of supported sites — all from a clean browser interface. A feature-rich take on MeTube.

Single host-networked Nomad service with config and downloads volumes.

Deploy

nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run ytptube --registry=nomploy

Configure

Variable Default Description
port 8081 Web UI port.
image ghcr.io/arabcoders/ytptube:latest Container image. Pin a tag in production.
data_volume ytptube_data /config — settings, presets and the queue database.
downloads_volume ytptube_downloads /downloads — downloaded media (files/ + tmp/).
resources { cpu = 300, memory = 256 } Task resources.

On first launch you create a local account. A prestart init task creates files/ and tmp/ under /downloads and chowns both volumes to uid 1000. Pairs with a media server like jellyfin or navidrome. Pin the job to the node holding the volumes with constraints.