FigJam Diagram: Seedbox Exporter — Prometheus Metrics Pipeline (expires 2026-04-13)
Custom Python Prometheus exporter that monitors the external RapidSeedbox used for downloading torrents. SFTP connectivity is operationally critical — rclone syncs completed downloads from the seedbox to the NAS, so an SFTP outage directly blocks media ingestion into the Jellyfin stack.
The exporter runs as a pod in the media namespace. There is no dedicated Docker image; the Python script is injected inline via a ConfigMap and executed inside a python:3.12-slim base container.
| Property | Value |
|---|---|
| Namespace | media |
| Image | python:3.12-slim |
| Script delivery | ConfigMap (inline) — no dedicated image |
| Metrics port | 9354 |
| Remote seedbox host | 45.128.27.65 |
| SFTP port | 2222 |
| CPU request / limit | 10m / 100m |
| RAM request / limit | 64Mi / 128Mi |
| Credentials secret | seedbox-exporter-credentials |
| Scrape interval | 60s (ServiceMonitor) |
| SSL verification | Disabled (seedbox uses self-signed cert) |
| Metric | Labels | Description |
|---|---|---|
seedbox_up |
— | rTorrent XML-RPC reachability (0 = down, 1 = up) |
seedbox_sftp_up |
— | SFTP TCP port reachability (0 = down, 1 = up) |
seedbox_torrents_total |
state |
Torrent count by state: Downloading, Seeding, Stopped, Hashing, Error |
seedbox_active_torrents |
— | Count of torrents with active data transfer |
seedbox_download_speed_bytes |
— | Current global download rate (bytes/sec) |
seedbox_upload_speed_bytes |
— | Current global upload rate (bytes/sec) |
seedbox_downloaded_bytes_total |
— | Cumulative session downloaded bytes |
seedbox_uploaded_bytes_total |
— | Cumulative session uploaded bytes |
seedbox_free_disk_bytes |
— | Free disk space on the seedbox |
seedbox_peers_total |
— | Current total peer count across all torrents |
seedbox_seeds_total |
— | Current total seed count across all torrents |
seedbox_global_ratio |
— | Session upload/download ratio |
seedbox_scrape_duration_seconds |
— | Time taken for the last scrape |
seedbox_scrape_errors_total |
— | Cumulative count of scrape errors |
Create the credentials secret before applying the manifest:
kubectl create secret generic seedbox-exporter-credentials \
-n media \
--from-literal=XMLRPC_URL=https://<seedbox-host>/RPC2 \
--from-literal=HTTP_USER=<username> \
--from-literal=HTTP_PASSWORD=<password> \
--from-literal=SFTP_HOST=45.128.27.65 \
--from-literal=SFTP_PORT=2222
The pod reads these as environment variables via envFrom.secretRef. No credentials appear in any manifest.
| Alert | Severity | For | Condition |
|---|---|---|---|
SeedboxDown |
warning | 10m | seedbox_up == 0 — XML-RPC unreachable |
SeedboxSFTPDown |
critical | 10m | seedbox_sftp_up == 0 — SFTP port down (blocks rclone sync) |
SeedboxDiskLow |
critical | 5m | Free disk < 5 GB |
SeedboxDiskWarning |
warning | 30m | Free disk < 20 GB |
SeedboxTorrentErrors |
warning | 30m | seedbox_torrents_total{state="Error"} > 0 |
SeedboxIdle |
info | 24h | seedbox_active_torrents == 0 — no active transfers for 24h |
SeedboxExporterDown |
warning | 5m | Exporter pod is down (Prometheus target missing) |
SeedboxSFTPDown fires critical because an SFTP outage directly blocks the rclone job that moves completed downloads from the seedbox to the NAS for Jellyfin ingestion.
Dashboard UID: seedbox-monitoring
Namespace: monitoring
Provisioned via ConfigMap with label grafana_dashboard: '1'
Status Row
Timeseries / Charts
Totals / Distribution
| File | Description |
|---|---|
kubernetes/apps/seedbox-exporter/seedbox-exporter.yaml |
Deployment, ConfigMap (inline script), Service, ServiceMonitor, AlertingRule |
kubernetes/apps/seedbox-exporter/grafana-dashboard.yaml |
Grafana dashboard ConfigMap (uid: seedbox-monitoring, namespace: monitoring) |