Hello, just discovered SparkBox and would love to use, my question is at the presence I have mini PC and installed ZimaOS but having issues, can this be installed on my PC, what I need, and how? please guide me to install P.S. I have 1TB nvme and 500gig system SSD.
20 replies
Chris wrote:
Short answer: yes — ZimaOS is Linux with Docker underneath, so SparkBox installs on your mini PC the same way it does on any Linux box. You'll need SSH turned on in ZimaOS settings, plus a terminal on another computer. Open a terminal, connect to the mini PC with ssh your-user@mini-pc-ip, then paste this one line: curl -fsSL https://get.tomsparkbox.com/install.sh | sudo bash That installs Docker (if it is not already there) and SparkBox, then prints a browser link to finish setup. Your 1TB and 500GB drives are plenty — the setup wizard asks where media should live, so you can point it at the 1TB drive. If any step errors, paste exactly what it says and I will take it from there.
hyewiz wrote:
I removed ZimaOS and installed Fedora 44 server edition and installed Sparkbox media servers, unfortunately did not paid attention to my drives it installed everything on my system 500gb SSD, and now it errors saying the drive is 95% full how can I fix this, I want everything to be on 1TB NVMe, and the operating system on the 500gb SSD. please help
Chris wrote:
That's your media filling the drive, not the install. On a fresh Linux install SparkBox puts the media library and downloads on the same disk as the app — by default under /opt/sparkbox/data/media — so everything you grab lands on the 500GB SSD. The OS and SparkBox itself are small and fine to leave there. To move media to the 1TB NVMe: first confirm it's mounted — run df -h and tell me the path it shows (like /mnt/...). Then open the dashboard, go to Settings → Media Root, set it to a folder on that drive (for example /mnt/nvme/media), and run sudo sparkbox up. It re-creates the folders and future downloads go to the 1TB. Avoid spaces in the path.
hyewiz wrote:
I think its not: hyewiz@ubuntu-server:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/fedoraubuntu--server-root 15G 14G 1.8G 89% / devtmpfs 16G 0 16G 0% /dev tmpfs 16G 0 16G 0% /dev/shm efivarfs 150K 67K 79K 46% /sys/firmware/efi/efivars tmpfs 6.3G 3.4M 6.3G 1% /run tmpfs 16G 16K 16G 1% /tmp /dev/sda2 2.0G 470M 1.5G 24% /boot /dev/sda1 599M 7.9M 591M 2% /boot/efi none 1.0M 0 1.0M 0% /run/credentials/getty@tty1.service tmpfs 3.2G 4.0K 3.2G 1% /run/user/1000 none 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service none 1.0M 0 1.0M 0% /run/credentials/systemd-resolved.service
Chris wrote:
Right — your output shows the 1TB NVMe isn't mounted at all, which is why nothing points to it. The 89%-full drive is your OS's root volume: Fedora carved a small 15GB system partition on the 500GB SSD, and SparkBox put downloads there (/opt/sparkbox/data/media). We'll move media to the NVMe. Next, run lsblk and paste the output — it lists every disk, so we can see the NVMe's device name (usually /dev/nvme0n1) and whether it has a filesystem yet. Then I'll give you the exact mount command, point Settings → Media Root at a folder on it, and run sudo sparkbox up.
hyewiz wrote:
hyewiz@ubuntu-server:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 600M 0 part /boot/efi ├─sda2 8:2 0 2G 0 part /boot └─sda3 8:3 0 463.2G 0 part └─fedoraubuntu--server-root 252:0 0 15G 0 lvm / zram0 251:0 0 8G 0 disk [SWAP] nvme0n1 259:0 0 953.9G 0 disk └─nvme0n1p1 259:1 0 953.9G 0 part
Chris wrote:
I can see it now — the 1TB NVMe is the nvme0n1 line, with one partition nvme0n1p1 (953.9GB), but nothing is mounted on it, which is why your media is landing on the full 15GB system drive instead. Plain lsblk doesn't show whether that partition is already formatted, so one more check: run lsblk -f and paste the result. The FSTYPE column tells us the next step — if it lists ext4, xfs, or btrfs, it's ready to mount; if it's blank, it just needs formatting first. Your OS and SparkBox staying on the 500GB drive is exactly right, so we only need to point media at the 1TB.
hyewiz wrote:
hyewiz@ubuntu-server:~$ lsblk -f NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS sda ├─sda1 vfat FAT32 C15C-CA80 590.9M 1% /boot/efi ├─sda2 xfs 93b29dc3-1669-447c-a784-0b0c9a157bc3 1.5G 24% /boot └─sda3 LVM2member LVM2 001 kDqVOv-JLHB-p5EQ-Oewz-9XOe-dzi3-GJO7qm └─fedoraubuntu--server-root xfs 325e67bd-45ad-4a01-9dc3-974756cf420a 1.7G 89% / zram0 swap 1 zram0 63beb800-6114-45fa-a6e5-1019218dcd77 [SWAP] nvme0n1 └─nvme0n1p1 ext4 1.0 nvmestorage 3f420267-3670-48e9-8a99-84c291846efe
Chris wrote:
Good news — your 1TB NVMe is already formatted (ext4, labeled nvmestorage); it just isn't mounted yet, which is why nothing can point at it and media keeps landing on the full system drive. Let's mount it. Run these three lines, one at a time: sudo mkdir -p /mnt/nvme sudo mount /dev/nvme0n1p1 /mnt/nvme df -h /mnt/nvme That last line should show /dev/nvme0n1p1 with roughly 954G available. Paste it back and I'll make the mount permanent so it survives a reboot, then point SparkBox's Media Root at a folder on it — after that everything downloads to the 1TB and your 500GB drive stops filling up.
hyewiz wrote:
hyewiz@ubuntu-server:~$ sudo mkdir -p /mnt/nvme [sudo] password for hyewiz: hyewiz@ubuntu-server:~$ sudo mount /dev/nvme0n1p1 /mnt/nvme hyewiz@ubuntu-server:~$ df -h /mnt/nvme Filesystem Size Used Avail Use% Mounted on /dev/nvme0n1p1 938G 28K 891G 1% /mnt/nvme hyewiz@ubuntu-server:~$
Chris wrote:
891G free — the drive is ready. Two short steps left: make the mount survive a reboot, then point media at it. Step one, add it to fstab (I'm including nofail so a missing drive can never stop the box from booting): echo 'UUID=3f420267-3670-48e9-8a99-84c291846efe /mnt/nvme ext4 defaults,nofail 0 2' | sudo tee -a /etc/fstab sudo mount -a df -h /mnt/nvme It should still print ~891G available. Step two: in the dashboard open Settings → Media Root, change it to /mnt/nvme/media, save, then run sudo sparkbox up. Future downloads go to the 1TB and the 500GB drive stops filling. If a command complains, send me the exact output.
hyewiz wrote:
cant find Media Root
Chris wrote:
It's tucked behind a collapsed menu, so it's easy to miss. In the dashboard, open Settings, then click the Server Config tab at the top. Scroll down and click the dropdown that says "Advanced — show raw configuration". Inside, find the group called Media — the first field there is Media Root. Type /mnt/nvme/media, then click Save Changes; SparkBox restarts the media apps itself so the new location takes effect. If you don't see a Server Config tab, tell me which tab names you do see and I'll guide you from there.
hyewiz wrote:
Restart failed — settings were saved, but the media stack did not come back up cleanly. Gluetun log tail: 2026-08-21T22:23:05-04:00 INFO [wireguard] Using available kernelspace implementation 2026-08-21T22:23:05-04:00 INFO [wireguard] Connecting to 92.119.177.19:51820 2026-08-21T22:23:05-04:00 INFO [wireguard] Wireguard setup is complete. Note Wireguard is a silent protocol and it may or may not work, without giving any error message. Typically i/o timeout errors indicate the Wireguard connection is not working. 2026-08-21T22:23:05-04:00 INFO [dns] downloading hostnames and IP block lists 2026-08-21T22:23:05-04:00 INFO [dns] DNS server listening on [::]:53 2026-08-21T22:23:05-04:00 INFO [dns] ready 2026-08-21T22:23:06-04:00 INFO [ip getter] Public IP address is 92.119.177.20 (United States, New York, New York City - source: ipinfo+ifconfig.co+ip2location+cloudflare) 2026-08-21T22:23:06-04:00 INFO [vpn] You are running the latest release v3.41.3
Chris wrote:
That log is actually the healthy one — the VPN connected to New York and pulled an address, so the tunnel is fine. The restart failure just means the media apps did not all come back in one go after the Media Root change, which can happen the first time. Lets settle it from the terminal: run sudo sparkbox up and share whatever it prints. That recreates the library folders (Movies/TV/Music) on the 1TB drive and brings the stack up cleanly. If it prints an error line, send it over and I will walk you through it.
hyewiz wrote:
SparkBox v1.6.610 - Self-Hosted Privacy Stack Created by Tom Spark | youtube.com/@TomSparkReviews Network profile: private [INFO] Starting SparkBox... [INFO] Active modules: core dashboard media [INFO] Prepared 2 module config dir(s) for PUID=1000 PGID=1001 [WARN] VPNPROVIDER=surfshark with VPNDOT='on': Surfshark blocks encrypted DNS inside the tunnel — if the VPN connects but apps report DNS/SSL errors, set VPNDOT=off. [+] up 3/3 ✔ Container sb-homepage Running 0.0s ✔ Container sb-npm Running 0.0s ✔ Container sb-portainer Running 0.0s [+] up 12/12 ✔ Container sb-sabnzbd Running 0.0s ✔ Container sb-radarr Running 0.0s ✔ Container sb-qbittorrent Running 0.0s ✔ Container sb-seerr Running 0.0s ✔ Container sb-sonarr Running 0.0s ✔ Container sb-prowlarr Running 0.0s ✔ Container sb-deunhealth Running 0.0s ✔ Container sb-bazarr Running 0.0s ✔ Container sb-gluetun Healthy 0.5s ✔ Container sb-flaresolverr Running 0.0s ✔ Container sb-lidarr Running 0.0s ✔ Container sb-jellyfin-media Started 0.0s [OK] SparkBox is running! [qbit-seed-limits] couldn't sign in to qBittorrent — skipping for now (retries on the next 'sparkbox up'; 'sudo sparkbox reset-password qbit' if it persists). [INFO] Auto-firing arr-bootstrap in the background (~90-180s)... [INFO] Jellyfin + Seerr credentials will appear in the launcher modals when ready. Service URLs: Core Infrastructure: Nginx Proxy Manager: http://192.168.2.163:81 Portainer: http://192.168.2.163:9000 Homepage: http://192.168.2.163:3000 TomSparkBox Dashboard: TomSparkBox Dashboard: http://192.168.2.163:8443 Media Center: qBittorrent: http://192.168.2.163:8089 Prowlarr: http://192.168.2.163:8181 Sonarr: http://192.168.2.163:8989 Radarr: http://192.168.2.163:7878 Bazarr: http://192.168.2.163:6767 Jellyfin (media bundle): http://192.168.2.163:8096 Seerr: http://192.168.2.163:5055 Lidarr: http://192.168.2.163:8686 Chaptarr: http://192.168.2.163:8789 SABnzbd (Usenet): http://192.168.2.163:8186 FlareSolverr: http://192.168.2.163:No Notifiarr: http://192.168.2.163:5454
hyewiz wrote:
also Jellyfin keeps crashing has red dot
Chris wrote:
Good news first: that up output is nearly all healthy — gluetun came up Healthy and every app except one shows Running. The exception is Jellyfin: it shows Started instead of Running, which is the red dot you're seeing. It's crashing and restarting in a loop (SparkBox auto-restarts it), so the dot keeps coming back. Rather than guess, let's read the actual reason. Run this and paste the last 20 lines — it streams, so press Ctrl+C when you have enough: sudo sparkbox logs jellyfin-media Once I see what that log says, I'll give you the exact next step.
hyewiz wrote:
hyewiz@ubuntu-server:~$ sudo sparkbox logs jellyfin-media [sudo] password for hyewiz: [12:56:30] [INF] [9] Main: Config directory path: /config/config [12:56:30] [INF] [9] Main: Cache path: /cache [12:56:30] [INF] [9] Main: Temp directory path: /tmp/jellyfin [12:56:30] [INF] [9] Main: Web resources path: /jellyfin/jellyfin-web [12:56:30] [INF] [9] Main: Application directory: /jellyfin/ [12:56:30] [FTL] [1] Main: Unhandled Exception System.InvalidOperationException: The path /config/data has insufficient free space. Available: 1.7GiB, Required: 2GiB. at Jellyfin.Server.Implementations.StorageHelpers.StorageHelper.TestDataDirectorySize(String path, ILogger logger, Int64 threshold) at Jellyfin.Server.Implementations.StorageHelpers.StorageHelper.TestCommonPathsForStorageCapacity(IApplicationPaths applicationPaths, ILogger logger) at Jellyfin.Server.Program.StartApp(StartupOptions options) at Jellyfin.Server.Program.<Main(String[] args) Unhandled exception. System.InvalidOperationException: The path /config/data has insufficient free space. Available: 1.7GiB, Required: 2GiB. at Jellyfin.Server.Implementations.StorageHelpers.StorageHelper.TestDataDirectorySize(String path, ILogger logger, Int64 threshold) at Jellyfin.Server.Implementations.StorageHelpers.StorageHelper.TestCommonPathsForStorageCapacity(IApplicationPaths applicationPaths, ILogger logger) at Jellyfin.Server.Program.StartApp(StartupOptions options) at Jellyfin.Server.Program.<Main(String[] args) [12:57:31] [INF] [1] Emby.Server.Implementations.AppBase.BaseConfigurationManager: Setting cache path: /cache [12:57:32] [INF] [7] Jellyfin.Server.ServerSetupApp.SetupServer: Kestrel is listening on 0.0.0.0 [12:57:32] [INF] [7] Main: Jellyfin version: 10.11.11 [12:57:32] [INF] [7] Main: Environment Variables: ["[JELLYFINFFMPEG, /usr/lib/jellyfin-ffmpeg/ffmpeg]", "[JELLYFINDATADIR, /config]", "[JELLYFINCACHEDIR, /cache]", "[JELLYFINWEBDIR, /jellyfin/jellyfin-web]", "[JELLYFINCONFIGDIR, /config/config]", "[JELLYFINLOGDIR, /config/log]"] [12:57:32] [INF] [7] Main: Arguments: ["/jellyfin/jellyfin.dll"] [12:57:32] [INF] [7] Main: Operating system: Debian GNU/Linux 13 (trixie) [12:57:32] [INF] [7] Main: Architecture: X64 [12:57:32] [INF] [7] Main: 64-Bit Process: True [12:57:32] [INF] [7] Main: User Interactive: True [12:57:32] [INF] [7] Main: Processor count: 2 [12:57:32] [INF] [7] Main: Program data path: /config [12:57:32] [INF] [7] Main: Log directory path: /config/log [12:57:32] [INF] [7] Main: Config directory path: /config/config [12:57:32] [INF] [7] Main: Cache path: /cache [12:57:32] [INF] [7] Main: Temp directory path: /tmp/jellyfin [12:57:32] [INF] [7] Main: Web resources path: /jellyfin/jellyfin-web [12:57:32] [INF] [7] Main: Application directory: /jellyfin/ [12:57:32] [FTL] [1] Main: Unhandled Exception
Chris wrote:
That error line tells us exactly what's wrong. Moving Media Root fixed where new media downloads go, but Jellyfin keeps its own database and artwork in a separate folder — /opt/sparkbox/modules/media/config/jellyfin — still on your 15GB system partition. It's full (~1.7GB free) and Jellyfin needs 2GB to start, so it crashes. Docker's app images share that same small partition. The real issue: Fedora gave your OS a 15GB slice of the 500GB SSD and left ~448GB unused. Run docker system df and paste the result so we can see Docker's footprint. Enlarging that partition is a system-level change I don't want to hand you as one-off commands — I'm flagging it to Tom, who handles these personally, to get you the exact safe steps.