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.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 816 ⚑ Report an issue
Save as values.hcl, edit, then run:
# 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
}
| Name | Type | Default | Description |
|---|---|---|---|
| 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. |
No variables match.
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.
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.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run streamystats --registry=nomploy
| 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
constraintsand back it up. Pairs with jellystat / tautulli.