Nomploy Nomad Packs

← All packs

streamystats v0.1.0

Media

Streamystats — a self-hosted statistics and analytics dashboard for Jellyfin and Emby: watch history, top content, users and trends. Batteries-included all-in-one image with a bundled PostgreSQL. Deployed as a single host-networked Nomad service.

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

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

1 task http 3000 1 volume image ghcr.io/fredrikburmester/streamystats-aio:latest tracks :latest image bumped today
Variables 10
values.hcl

Save as values.hcl, edit, then run:

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

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

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

# The Streamystats container image. Pin a tag in production.
image = "ghcr.io/fredrikburmester/streamystats-aio:latest"

# Host port for the Streamystats web UI.
port = 3000

# Named volume mounted at /var/lib/postgresql/data — the bundled PostgreSQL data (holds all stats).
data_volume = "streamystats_data"

# Password for the bundled PostgreSQL. CHANGE THIS.
db_password = "change-me-streamystats-db"

# Secret used to sign sessions (SESSION_SECRET). CHANGE THIS. Generate with: openssl rand -hex 64.
session_secret = "change-me-openssl-rand-hex-64"

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

# The task resources.
resources = {
    cpu    = 700
    memory = 768
  }
NameTypeDefaultDescription
job_name string
"streamystats"
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/fredrikburmester/streamystats-aio:latest"
The Streamystats container image. Pin a tag in production.
port number
3000
Host port for the Streamystats web UI.
data_volume string
"streamystats_data"
Named volume mounted at /var/lib/postgresql/data — the bundled PostgreSQL data (holds all stats).
db_password set me string
"change-me-streamystats-db"
Password for the bundled PostgreSQL. CHANGE THIS.
session_secret set me string
"change-me-openssl-rand-hex-64"
Secret used to sign sessions (SESSION_SECRET). CHANGE THIS. Generate with: openssl rand -hex 64.
constraints list
[]
Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
resources object
{
    cpu    = 700
    memory = 768
  }
The task resources.
Back up this pack

This pack stores data in one Docker named volume: streamystats_data

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/streamystats_data/_data

rclone (sync to S3/R2)

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

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

streamystats

Streamystats — a self-hosted statistics and analytics dashboard for Jellyfin and Emby. See watch history, most-watched content, per-user activity, libraries and trends over time. This pack uses the all-in-one image, which bundles PostgreSQL, the job server and the web app in one container.

Single host-networked Nomad service with one persistent data volume.

Deploy

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

Configure

Variable Default Description
port 3000 Web UI port.
db_password change-me-… Change this. Bundled PostgreSQL password.
session_secret change-me-… Change this. Signs sessions. openssl rand -hex 64.
image ghcr.io/fredrikburmester/streamystats-aio:latest All-in-one image. Pin a tag in production.
data_volume streamystats_data /var/lib/postgresql/data — the bundled database (all stats).
resources { cpu = 700, memory = 768 } Task resources.

On first launch, connect it to your jellyfin server with an API key and let it sync. Because the bundled Postgres holds all data, pin the job to the node holding the volume with constraints and back it up. Pairs with jellystat / tautulli.