slskd — a modern, self-hosted client for the Soulseek peer-to-peer file-sharing network, with a web UI, search, downloads, and a REST API (a headless, always-on replacement for the desktop Soulseek client). Deployed as a host-networked Nomad service with a persistent data volume.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 4k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "slskd"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The slskd container image. Pin a tag in production.
image = "slskd/slskd:latest"
# Host port for the web UI (SLSKD_HTTP_PORT).
web_port = 5030
# Host port slskd listens on for incoming Soulseek connections (SLSKD_SLSK_LISTEN_PORT). Forward this if you can, for better peering.
listen_port = 50300
# Your Soulseek network username (SLSKD_SLSK_USERNAME).
slsk_username = "change-me"
# Your Soulseek network password (SLSKD_SLSK_PASSWORD).
slsk_password = "change-me"
# Named volume for slskd data (/app): config, database, downloads, and shares.
data_volume = "slskd_data"
# Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# Resources for the slskd task.
resources = {
cpu = 500
memory = 256
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "slskd" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "slskd/slskd:latest" | The slskd container image. Pin a tag in production. |
| web_port | number | 5030 | Host port for the web UI (SLSKD_HTTP_PORT). |
| listen_port | number | 50300 | Host port slskd listens on for incoming Soulseek connections (SLSKD_SLSK_LISTEN_PORT). Forward this if you can, for better peering. |
| slsk_username set me | string | "change-me" | Your Soulseek network username (SLSKD_SLSK_USERNAME). |
| slsk_password set me | string | "change-me" | Your Soulseek network password (SLSKD_SLSK_PASSWORD). |
| data_volume | string | "slskd_data" | Named volume for slskd data (/app): config, database, downloads, and shares. |
| constraints | list | [] | Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 500
memory = 256
} | Resources for the slskd task. |
No variables match.
This pack stores data in one Docker named volume:
slskd_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/slskd_data/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/slskd_data/_data backup:<bucket>/slskd_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.
slskd — a modern, self-hosted client for the Soulseek peer-to-peer network. Run it headless and always-on with a clean web UI, search, download queue, shares, and a REST API — a server-friendly replacement for the desktop Soulseek client.
Single host-networked Nomad service with a persistent data volume.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run slskd --registry=nomploy
| Variable | Default | Description |
|---|---|---|
web_port |
5030 |
Web UI port (SLSKD_HTTP_PORT). |
listen_port |
50300 |
Incoming Soulseek connections (SLSKD_SLSK_LISTEN_PORT). Forward it for better peering. |
slsk_username / slsk_password |
change-me |
Your Soulseek network account (SLSKD_SLSK_*). |
data_volume |
slskd_data |
/app — config, database, downloads, shares. |
image |
slskd/slskd:latest |
Container image. Pin a tag in production. |
resources |
{ cpu = 500, memory = 256 } |
Task resources. |
Set your Soulseek credentials, then open the web UI. The web login defaults to slskd / slskd — change
it under Options (or the config file in the volume). Serves plain HTTP — front it with a reverse proxy for TLS,
and only share content you have the rights to. Pin the job to the node holding the volume with constraints.