I'm trying to install Sparkbox on Windows 11 using WSL2 with Debian. I'm currently stuck getting an error on an apk add step. I don't recognize this as a linux command, and running it outside of the setup shows command not found. I'm not sure what the next steps are here, so I'm open to any suggestions. Log output snippet: [Setup] Deploying SparkBox... / | | | | ) \ \| ' \ / | '| |/ / \ / \ \/ / ) | |) | (| | | | <| |) | () < |/| ./ \,|| ||\\/ \//\\ || SparkBox v1.6.152 - Self-Hosted Privacy Stack Created by Tom Spark | youtube.com/@TomSparkReviews Network profile: private [INFO] Starting SparkBox... [INFO] Active modules: cloud core dashboard files monitoring pihole vaultwarden vpn [INFO] Prepared 5 module config dir(s) for PUID=1000 PGID=1000 [INFO] Fetching images for module: dashboard [OK] All required images present. [+] Building 11.8s (7/12) = [internal] load local bake definitions 0.0s = = reading from stdin 548B 0.0s = [internal] load build definition from Dockerfile 0.1s = = transferring dockerfile: 1.29kB 0.0s = [internal] load metadata for docker.io/library/node:20-alpine 0.7s = [internal] load .dockerignore 0.0s = = transferring context: 129B 0.0s = CACHED [1/7] FROM docker.io/library/node:20-alpine@sha256:fb4cd12c85ee03686f6af5362a0b0d56d50c58a04632e6c0fb8363f609372293 0.1s = = resolve docker.io/library/node:20-alpine@sha256:fb4cd12c85ee03686f6af5362a0b0d56d50c58a04632e6c0fb8363f609372293 0.0s = [internal] load build context 0.1s = = transferring context: 4.45kB 0.0s = ERROR [2/7] RUN apk add --no-cache bash docker-cli docker-cli-compose curl coreutils su-exec tar openssl 10.6s ------ [2/7] RUN apk add --no-cache bash docker-cli docker-cli-compose curl coreutils su-exec tar openssl: 5.566 WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.23/main/x8664/APKINDEX.tar.gz: DNS: transient error (try again later) 10.58 WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.23/community/x8664/APKINDEX.tar.gz: DNS: transient error (try again later) 10.58 ERROR: unable to select packages: 10.58 bash (no such package): 10.58 required by: world[bash] 10.58 coreutils (no such package): 10.58 required by: world[coreutils] 10.58 curl (no such package): 10.58 required by: world[curl] 10.58 docker-cli (no such package): 10.58 required by: world[docker-cli] 10.58 docker-cli-compose (no such package): 10.58 required by: world[docker-cli-compose] 10.58 openssl (no such package): 10.58 required by: world[openssl] 10.58 su-exec (no such package): 10.58 required by: world[su-exec] 10.58 tar (no such package): 10.58 required by: world[tar] ------ skylyn@Name-PC:/opt/sparkbox$ sudo sparkbox doctor / | | | | ) \ \| ' \ / | '| |/ / \ / \ \/ / ) | |) | (| | | | <| |) | () < |/| ./ \,|| ||\\/ \//\\ || SparkBox v1.6.152 - Self-Hosted Privacy Stack Created by Tom Spark | youtube.com/@TomSparkReviews Network profile: private SparkBox Doctor Running diagnostics... [Docker] [OK] Docker daemon is accessible [OK] Docker version: Docker version 29.5.2, build 79eb04c [OK] Docker Compose: 5.1.4 [Docker Socket] [OK] Docker socket exists at /var/run/docker.sock [OK] Docker socket is readable [User IDs] [INFO] Current user: root (UID=0, GID=0) [OK] PUID=1000 (containers run as UID 1000) [OK] PGID=1000 (containers run as GID 1000) [Container Egress] [WARN] Container egress check failed — sbproxy cannot reach webhook.tomsparkbox.com. This is fine if you only need free SparkBox. Optional Pro-tier license activation won't work until egress is restored, but every bundled app (Jellyfin, Pi-hole, Vaultwarden, etc.) runs the same either way. If you DO want to fix it (Pro tier only): 1. UFW: grep DEFAULTFORWARDPOLICY /etc/default/ufw (should be ACCEPT) 2. Run: sudo sparkbox repair-network 3. If you have a custom /etc/docker/daemon.json, check its DNS settings. Re-run 'sparkbox doctor' to verify. [Port Conflicts] [WARN] Port 53: in use by non-Docker process LISTEN 0 1000 10.255.255.254:53 0.0.0.0:
18 replies
skylyn wrote:
According to the logs from Sparkbox, I am using SparkBox v1.6.152. skylyn@Name-PC:/opt/sparkbox$ uname -a Linux Name-PC 6.6.114.1-microsoft-standard-WSL2 1 SMP PREEMPTDYNAMIC Mon Dec 1 20:46:23 UTC 2025 x8664 GNU/Linux
skylyn wrote:
my /etc/os-release looks like this PRETTYNAME="Debian GNU/Linux 13 (trixie)" NAME="Debian GNU/Linux" VERSIONID="13" VERSION="13 (trixie)" VERSIONCODENAME=trixie DEBIANVERSIONFULL=13.5 ID=debian HOMEURL="https://www.debian.org/" SUPPORTURL="https://www.debian.org/support" BUGREPORTURL="https://bugs.debian.org/"
skylyn wrote:
One other note: the setup wizard appears broken. It pops up with the "ok" screen, but after that it disappears. I can get through it by just blindly pressing enter, but I'm just seeing the terminal output with no actual visible setup wizard. This is less important as I assume I can change these settings later and I can get through the wizard with just defaults. [Setup] Select your server profile... [Setup] Profile selected: privacy [Setup] Configuring system settings... [Setup] Detected user IDs: PUID=0, PGID=0 [Setup] Running as root via sudo. Using original user IDs: PUID=1000, PGID=1000 [Setup] Selecting modules... [Setup] Modules configured: core dashboard cloud files monitoring pihole vaultwarden vpn [Setup] Setting up dashboard access... [Setup] Generating configuration file...
tomspark wrote:
Good news — you didn't break anything, and this isn't really a SparkBox bug. Look at the two WARNING lines just above the error: dl-cdn.alpinelinux.org ... DNS: transient error. SparkBox builds its dashboard inside Docker, and your Docker couldn't reach the internet to download what it needed, so it bailed out with that apk message. It's a common WSL2 networking hiccup, not your distro. Try these in order: 1) Just run the install command again — the log literally says "try again later," so it's often a momentary blip that clears on a retry. 2) If it keeps failing, point Docker at a reliable DNS: create the file /etc/docker/daemon.json containing {"dns": ["8.8.8.8", "1.1.1.1"]}, then run sudo service docker restart, then re-run the install. (On Docker Desktop, set the same thing under Settings → Docker Engine and restart it.) Tell me which step gets you through.
skylyn wrote:
I'm still unable to get the services up. I did try several times before posting and with a restart in between, but it's still trying to run the apk command. I did verify that I can ping 8.8.8.8 and google.com so I have internet access and the dns server is working. I'm not sure why it's trying to fetch an alpine package on my debian server. skylyn@Name-PC:/opt/sparkbox$ sudo vim /etc/docker/daemon.json skylyn@Name-PC:/opt/sparkbox$ ./sparkbox up / | | | | ) \ \| ' \ / | '| |/ / \ / \ \/ / ) | |) | (| | | | <| |) | () < |/| ./ \,|| ||\\/ \//\\ || SparkBox v1.6.152 - Self-Hosted Privacy Stack Created by Tom Spark | youtube.com/@TomSparkReviews [INFO] Starting SparkBox... [INFO] Active modules: core dashboard [INFO] Fetching images for module: dashboard WARN[0000] The "SBADMINPASSWORDHASH" variable is not set. Defaulting to a blank string. WARN[0000] The "SBSESSIONSECRET" variable is not set. Defaulting to a blank string. [+] pull 1/1 ✔ sparkbox-dashboard Skipped No image to be pulled 0.0s [OK] All required images present. [+] up 3/3 ✔ Container sb-homepage Running 0.0s ✔ Container sb-npm Running 0.0s ✔ Container sb-portainer Started 0.0s WARN[0000] The "SBADMINPASSWORDHASH" variable is not set. Defaulting to a blank string. WARN[0000] The "SBSESSIONSECRET" variable is not set. Defaulting to a blank string. [+] Building 12.8s (7/12) = [internal] load local bake definitions 0.0s = = reading from stdin 588B 0.0s = [internal] load build definition from Dockerfile 0.1s = = transferring dockerfile: 1.29kB 0.0s = [internal] load metadata for docker.io/library/node:20-alpine 0.5s = [internal] load .dockerignore 0.1s = = transferring context: 129B 0.0s = CACHED [1/7] FROM docker.io/library/node:20-alpine@sha256:fb4cd12c85ee03686f6af5362a0b0d56d50c58a04632e6c0fb8363f609372293 0.5s = = resolve docker.io/library/node:20-alpine@sha256:fb4cd12c85ee03686f6af5362a0b0d56d50c58a04632e6c0fb8363f609372293 0.5s = [internal] load build context 0.3s = = transferring context: 4.45kB 0.0s = ERROR [2/7] RUN apk add --no-cache bash docker-cli docker-cli-compose curl coreutils su-exec tar openssl 11.1s ------ [2/7] RUN apk add --no-cache bash docker-cli docker-cli-compose curl coreutils su-exec tar openssl: 6.029 WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.23/main/x8664/APKINDEX.tar.gz: DNS: transient error (try again later) 11.04 WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.23/community/x8664/APKINDEX.tar.gz: DNS: transient error (try again later) 11.04 ERROR: unable to select packages: 11.04 bash (no such package): 11.04 required by: world[bash] 11.04 coreutils (no such package): 11.04 required by: world[coreutils] 11.04 curl (no such package): 11.04 required by: world[curl] 11.04 docker-cli (no such package): 11.04 required by: world[docker-cli] 11.04 docker-cli-compose (no such package): 11.04 required by: world[docker-cli-compose] 11.04 openssl (no such package): 11.04 required by: world[openssl] 11.04 su-exec (no such package): 11.04 required by: world[su-exec] 11.04 tar (no such package): 11.04 required by: world[tar] ------ [+] up 0/1 ⠙ Image sparkbox-sparkbox-dashboard Building 13.4s Dockerfile:14 -------------------- 12 | aborting the whole backup. Without GNU tar, the first backup attempt 13 | fails on any module whose container writes its own private files. 14 | RUN apk add --no-cache bash docker-cli docker-cli-compose curl coreutils su-exec tar openssl 15 | 16 | WORKDIR /app -------------------- failed to solve: process "/bin/sh -c apk add --no-cache bash docker-cli docker-cli-compose curl coreutils su-exec tar openssl" did not complete successfully: exit code: 8 skylyn@Name-PC:/opt/sparkbox$ ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmpseq=1 ttl=111 time=12.3 ms 64 bytes from 8.8.8.8: icmpseq=2 ttl=111 time=27.8 ms 64 bytes from 8.8.8.8: icmpseq=3 ttl=111 time=15.0 ms 64 bytes from 8.8.8.8: icmpseq=4 ttl=111 time=12.2 ms 64 bytes from 8.8.8.8: icmpseq=5 ttl=111 time=16.7 ms ... ^C --- 8.8.8.8 ping statistics --- 33 packets transmitted, 33 received, 0% packet loss, time 32050ms rtt min/avg/max/mdev = 8.140/24.993/129.583/24.703 ms skylyn@Name-PC:/opt/sparkbox$ ping google.com PING google.com (142.251.219.46) 56(84) bytes of data. 64 bytes from ncsfoa-an-in-f14.1e100.net (142.251.219.46): icmpseq=1 ttl=111 time=9.98 ms 64 bytes from ncsfoa-an-in-f14.1e100.net (142.251.219.46): icmpseq=2 ttl=111 time=15.9 ms 64 bytes from ncsfoa-an-in-f14.1e100.net (142.251.219.46): icmpseq=3 ttl=111 time=12.5 ms 64 bytes from ncsfoa-an-in-f14.1e100.net (142.251.219.46): icmpseq=4 ttl=111 time=7.59 ms 64 bytes from ncsfoa-an-in-f14.1e100.net (142.251.219.46): icmpseq=5 ttl=111 time=12.9 ms ^C --- google.com ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4005ms rtt min/avg/max/mdev = 7.585/11.771/15.918/2.817 ms skylyn@Name-PC:/opt/sparkbox$ ping https://dl-cdn.alpinelinux.org/alpine/v3.23/main/x8664/APKINDEX.tar.gz ping: https://dl-cdn.alpinelinux.org/alpine/v3.23/main/x8664/APKINDEX.tar.gz: Name or service not known skylynName-PC:/opt/sparkbox$ cat /etc/docker/daemon.json { "dns":["8.8.8.8", "1.1.1.1"] } skylyn@Name-PC:/opt/sparkbox$
tomspark wrote:
Found the missing piece: you edited daemon.json but ran ./sparkbox up without restarting Docker — that file only takes effect after a restart, so Docker is still on the old DNS. Run: sudo service docker restart — wait ~10 seconds — then sudo ./sparkbox up again. (That's also why ping works but the build doesn't: ping uses your host's DNS, which is fine; the build uses Docker's, which won't see your change until Docker restarts.) And don't worry about the apk part — that's not running on Debian. SparkBox builds its little dashboard from an Alpine-based image, and apk is just that image's installer grabbing its pieces inside the build. Totally normal; it only failed because Docker had no working DNS yet. If it somehow still stops at the same step after the restart, force the older build engine that definitely respects that setting: sudo DOCKERBUILDKIT=0 COMPOSEDOCKERCLIBUILD=0 ./sparkbox up. I'm pretty sure the restart alone does it though — let me know how it goes. (Separately: thanks for flagging the setup wizard not showing — pressing through with defaults was exactly the right move, you can change anything later in the dashboard. That's the menu not drawing in some WSL terminals; I'm logging it.)
skylyn wrote:
Thanks for the help. I did eventually get it working, though restarting docker was not enough to get it to work. I ended up having to nuke the whole install and reinstall. Not sure what changed to make the install work after the nuke (other than the docker dns config), but it is working now. Thanks for making this setup! I've been considering setting up a server for a while but the barrier was always just a bit higher than I wanted to deal with. Sparkbox gave me the push I needed to take the plunge.
tomspark wrote:
Awesome — really glad you got there, and thank you for the kind words 🙏. That kind of feedback is exactly why this project exists. For what it's worth on the technical side: it sounds like the daemon.json DNS fix DID land the build environment in a good state, but a stale half-built dashboard image (left over from the earlier failed pulls) was sitting in Docker, and the rebuild couldn't recover from it cleanly — wiping the install let it start fresh. Useful data point; I'll work that recovery step into the install path so the next person doesn't have to nuke. Welcome to the self-hosted side. If anything else feels off as you settle in, drop a thread here — happy to help.
skylyn wrote:
I'm still struggling to get everything working here. I wasn't able to access anything from outside the host. That appears to be a WSL issue. I tried enabling mirrored network mode, but that threw an error every time I started wsl and defaulted back to no networking. I did eventually get around this by disabling mirrored network mode and adding rules to the windows firewall to allow ports for each of the apps that I need to access through. However, now I have some things downloaded thanks to seer and qBit, but Jellyfin doesn't show any of the things I have downloaded. I setup my media directory to point to a folder on another drive (f:\sparkbox in Windows). qBit is downloading correctly to the folder on my f: drive, but Jellyfin doesn't see anything. I tried manually adding that folder to jellyfin's libraries (/mnt/f/sparkbox), but it says it can't access that folder. Jellyfin shows it's pointing to /data/TV, but there is no /data folder, so I don't know what it thinks it's looking at. Looking at the /mnt/f/sparkbox folder it looks like any user should have read and execute access. skylyn@Name-PC:/mnt/f/sparkbox$ ls -alh total 0 drwxr-xr-x 1 skylyn skylyn 512 May 27 21:52 . drwxr-xr-x 1 skylyn skylyn 512 May 28 17:49 .. drwxr-xr-x 1 skylyn skylyn 512 May 28 17:42 Media skylyn@Name-PC:/mnt/f/sparkbox$ cd Media/ skylyn@Name-PC:/mnt/f/sparkbox/Media$ ls -alh total 0 drwxr-xr-x 1 skylyn skylyn 512 May 28 17:42 . drwxr-xr-x 1 skylyn skylyn 512 May 27 21:52 .. drwxr-xr-x 1 skylyn skylyn 512 May 28 18:07 downloads skylyn@Name-PC:/mnt/f/sparkbox/Media$ cd /data -bash: cd: /data: No such file or directory
tomspark wrote:
Glad the reinstall got you running! The 'can't reach it from other devices' part is a WSL2 limitation, not SparkBox — WSL2 runs in its own walled-off network on Windows, so by default nothing on your LAN can see the services inside it. Mirrored networking is Microsoft's fix for that, and it's still flaky (as you found). The reliable path: run SparkBox on a box that's directly on your network — an old laptop with Ubuntu, a NAS, or a cheap VPS. WSL2 is great for kicking the tires, but for something you reach from your phone or TV, a real host saves a lot of Windows-networking pain.
skylyn wrote:
I did resolve the ability to reach it from my phone or another device. Took a bit a digging, but I got that part working. The part I'm still struggling with is getting jellyfin to see the media after qBit has downloaded it. Definitely understand it's easier on a dedicated box, but I don't have another option right now. That's why it has been a headache to get started. I saw sparkbox listed wsl as a supported option, so I was hopeful I'd be able to get it running there.
tomspark wrote:
Nice work getting the network sorted — that's the hard part on WSL2. For Jellyfin seeing your downloads, the key is HOW you're grabbing them. SparkBox's automatic flow is: you request a movie/show through the request page (or in Radarr/Sonarr), it hands the download to qBittorrent, and when it finishes the movie/TV app moves it into the library folder Jellyfin watches — then it shows up on its own. If instead you're grabbing things by hand inside qBittorrent, they just sit in the downloads folder and nothing moves them into the library, so Jellyfin never sees them. So which is it — are you requesting through the apps, or downloading manually in qBit? That tells me exactly where to point you next.
skylyn wrote:
I haven't done anything in qBit directly. Only requested stuff through Sonarr and Seerr I tried requesting stuff through Sonarr at first but those didn't seem to actually show up in qBit, so I requested them through Seer and then they did. It's also possible I just had a stale page of qBit up when I was requesting through Sonarr, though. Ome way or another now everything I've requested has been through Seerr (which I believe just passes through to Sonarr anyway).
tomspark wrote:
That's the clue I needed — if it's downloading through Seerr → Sonarr and landing in qBit, the download side is fine. (And yep, Seerr just hands off to Sonarr, so that's expected.) The break is the next step: Sonarr moving the finished file into the library folder Jellyfin watches. Two things to check in Sonarr, and they'll usually name the exact problem: 1. Look for a warning icon near the top of Sonarr (or open System then Status) — click it and paste any health warnings. There's often one that spells out the issue word-for-word. 2. Open Activity then Queue right after a download finishes — does the item sit there with a red error, or disappear (which means it imported)? Paste what those show and I'll know exactly what's blocking it.
skylyn wrote:
Sonarr's system status has a red warning. Missing root folder: /data/TV That makes sense for why Jellyfin isn't seeing the media. I tried creating a data/TV folder under the Sparkbox folder and restarting, but that didn't help. I expect that's because it's looking for a root data folder. Can I change the location it's looking for (and the location jellyfin is looking) so that the data stays on the drive where I setup the media?
tomspark wrote:
That's the smoking gun. Sonarr's root folder is /data/TV, which (inside the container) maps to a TV folder inside your MEDIAROOT on the host — and that folder doesn't exist where SparkBox is looking, so imports have nowhere to land. And yes — you control exactly where media lives via MEDIAROOT. To put it on the drive you want: 1. Open /opt/sparkbox/.env and set MEDIAROOT to the path on that drive, e.g. MEDIAROOT=/mnt/yourdrive/media 2. Create the folders there — capital names matter: mkdir -p /mnt/yourdrive/media/{Movies,TV,Music,downloads} 3. Run sudo sparkbox up (not just restart — that's why creating the folder and restarting didn't take; 'up' re-mounts the containers at the new path) After that, /data/TV resolves, imports flow, and Jellyfin (which also looks under /data) picks up the library. Tell me your drive's actual path and I'll hand you the exact lines.
skylyn wrote:
That did it. I did run sparkbox up after creating the folder, but I created media/data/TV instead of just media/TV. I got it running and have confirmed I can watch videos both on my desktop and on other devices on the network. Thanks so much for creating Sparkbox and all the help getting it set up!
tomspark wrote:
That's the one — media/data/TV when it just needed media/TV. Easy mix-up, since /data is the mount point inside the container, not a folder you create on the host. Genuinely impressed you pushed through the whole WSL2 gauntlet to get here — install, networking, and the import path all sorted. Enjoy it, and thanks for the kind words. 🎉