Hi Tom, team, First, I really like what you are doing with this board and one-click program. It really is pretty cool to see it doing installs. Now, to the issue. I ran into a VPN issue (using Mullvad... your surfshark link seems to be dead) where I couldn't update the VPN information (it was related to WireGuard information see this post but I ran into a bug that wouldn't allow me to remove the previous VPN information to do what was recommended in this reddit thread. I nuked the entire installation (full factory reset then actually removed TomSparkBox ) and then reinstall it thinking I would be able to restart the dashboard and load the correct information... well I have now run into a big bug with portainer (see below) [INFO] Portainer secret missing or invalid — reseeding secret (existing Portainer data kept)... /usr/local/bin/sparkbox: line 6119: /opt/sparkbox/modules/core/config/portainer-admin-password: Is a directory I saw a similar thread but I couldn't use any of the suggestions there to clear the issue and after a week I'm still stuck . I have run the doctor and tried to run portainer self-repair . This was the logs after portainer self-repair . I'm a newbie to Linux and don't have strong terminal knowledge. Please help me. I was able to see the programs getting install by your dashboard and it was really cool. Also, I don't know why it says unlicensed... I'm a legendary backer but I guess it's because I can't access the dashboard to login with my info. I appreciate the help and keep up the great work. I really want to setup my media center using my DXP4800 NAS. Sincerely, Linux grasshopper
12 replies
Chris wrote:
Hey OppaiDragon -- sorry for the trouble, and no, you didn't break anything. This is a real bug on our end. After a full reset and reinstall, a leftover empty folder can end up sitting where a small password file is supposed to go, and that's exactly what's causing the "Is a directory" message you're seeing -- it blocks our normal repair step from writing a fresh password. This is already flagged for Tom's team to fix, so I don't want to hand you a manual workaround that might not actually hold. On the license side, don't worry -- your Legend status isn't lost, it just can't show while the dashboard's down. I'll update this thread once there's news.
Chris wrote:
Following up like promised, and it is good news: Tom shipped the fix for this exact bug in v1.6.523, the same day you posted. The reset had left an empty folder where Portainer's password file belongs, and every repair run tripped over it — that is the "Is a directory" line you saw. Since your dashboard is down, update over SSH: sudo sparkbox upgrade — then run sudo sparkbox up once. That clears the stale folder, reseeds the password, and the dashboard comes back with your Legend status intact. If anything still refuses to load after that, paste the new output here and Tom will take it from there.
Chris wrote:
Good news on two fronts: your gluetun log actually shows Mullvad connected fine -- WireGuard set up, public IP resolved to Sweden, no errors there. The real issue is sb-seerr crash-looping on a permission error in its own config folder (EACCES on /app/config/logs), which is unrelated to the VPN or the license. Run sudo sparkbox repair-seerr to fix it -- it resets Seerr's own config (you'll see a fresh setup wizard) but re-links Sonarr/Radarr automatically and doesn't touch anything else on the box. Keep sitting tight on the license count; that one really does resolve on its own.
Chris wrote:
Thanks for running that — you're almost through the Seerr part. The repair leaves you with a fresh setup, so next open Seerr from your dashboard and it should land on the first-run wizard; sign in with your Jellyfin credentials when it asks. If the output instead said it couldn't reach Seerr, paste those last few lines and I'll keep digging. For Audiobookshelf and Calibre Web, the apps can only see folders that are mounted on the box and pointed at via Settings → Media Root, then run sudo sparkbox up. That's the mount + Media Root step, not really a Pop!OS quirk. Tom's newbie guide covers it: https://tomsparkbox.com/guides/use-existing-ugreen-media.html
Chris wrote:
Happy to sort this out. The one thing tripping you up: MEDIAROOT is a single folder, not a list — each of those four sed commands overwrote the one before it, so only the last one is actually live. That's the mess. Set it once to the parent folder that holds all your categories. Since Anime, Movies, Music and the rest sit directly under /volume1, that parent is /volume1 (not /volume1/Media). The cleanest way is Settings → Media → Media Root, which restarts the media apps for you automatically. Then in Jellyfin, create one library per category and point each at its own /data subfolder — Movies → /data/Movies, Anime → /data/Anime. That's how you choose exactly which folders Jellyfin shows.
OppaiDragon wrote:
First, thank you. This update worked really well and has return my dashboard. I'm having issues with the vpn connection (mullvad) and my license. The dashboard says 1 out of 3 active but it's not letting me access Tom AI
Chris wrote:
Glad the dashboard's back! Two separate things here: the '1 out of 3' is your license's machine-activation count (how many installs are tied to the key), not a Tom AI limit -- if it looks stuck after your reinstall, it should self-correct on its own within a few days, no action needed. For Tom AI itself, check Settings - License and see what tier/status shows there; if it says anything other than active Legend, let me know the exact message. For the Mullvad connection, run sudo sparkbox doctor -- it specifically checks for a tunnel that reports healthy but is actually cycling/dropping, which is a common cause of VPN trouble that isn't obvious from the dashboard tiles. Paste the output here if it flags anything and I'll dig further.
OppaiDragon wrote:
Understood Chris bot. I will wait for the license to update or self-correct. Below, please find the images for my sparkbox doctor logs for sb-seerr and these are the sparkbox doctor gluetun . Btw, your surfshark link is finally working so if mullvad keeps been an issue, I could update the vpn information with a surfshark subscription but I just prefer mullvad for privacy.
OppaiDragon wrote:
Thank you Chris. I ran sudo sparkbox repair-seerr to fix it and receive the following logs... and . Please let me know how to proceed. In the meantime, how do I make my Audiobookshelf & Calibre Web app to recognize the storage locations in my DXP4800 NAS. Maybe it's a Linux/System76 PoPOS distro issue that web apps can't locate network drives. Do you have a self-help guide or youtube video (from Tom) that goes through first time setup for newbie users. As always thank you for the support and great work
OppaiDragon wrote:
Hi Chris, let's put the Seerr part aside from now... I'm planning to do this after setting up Jellyfin. For Jellyfin, I need help. TL;DR - My media is already separated by subfolder (root DXP4800, e.g. Anime, Music, Movies, TV Shows, etc.) and I want sudo sed -i 's|^MEDIAROOT=.|MEDIAROOT=/volume1/ to allow me to add all the subfolders not just 1 at a time. Tom's Jellyfin guide is pretty good. I was able to follow up but now I'm confused. I have several folder in my root folder. They all point at different type of media. Here are the examples /volume1/Anime| but I also have /volume1/Cartoons, /volume1/Movies, /volume1/Audiobooks, etc. How do I use sudo sed -i 's|^MEDIAROOT=.|MEDIAROOT=/volume1/Media|' /opt/sparkbox/.env to select only the subfolders that I want Jellyfin to see instead of all the different subfolders in my DXP4800 volume? Right now I have a huge mess because I did the following... 1. sudo sed -i 's|^MEDIAROOT=.|MEDIAROOT=/volume1/Anime| 1. sudo sed -i 's|^MEDIAROOT=.|MEDIAROOT=/volume1/TVShows| 1. sudo sed -i 's|^MEDIAROOT=.|MEDIAROOT=/volume1/Movies| 1. sudo sed -i 's|^MEDIAROOT=.|MEDIAROOT=/volume1/Music| and now instead of seeing the individual subfolders (/data/Anime, /data/Music, etc) with all the categorize media in Jellyfin, I have a huge /data location with all the different sub subfolders instead of the top subfolder. For example /data/Anime instead of /data/Your Name. This is an issue because I want to create categorize libraries in Jellyfin and only use movies or anime path for the movies or anime root folder in my DXP4800
OppaiDragon wrote:
Hi Chris, this helped a lot. My Jellyfin libraries are filling up. This is pretty cool. Now, I want to move to audiobookshelf. I'm following this guide but I can't get my audiobook folder (in my DXP4800) to be recognize to create a audiobook library. I'm guessing it's because the media root folder isn't recognized by the audiobookshelf app and I need to do a similar command like the media root one (for Jellyfin) to get audiobookshelf to mount my audiobook locations. Here are the logs... 2026-08-19 23:35:27.858 INFO === Starting Server === 2026-08-19 23:35:27.859 INFO [Server] Init v2.35.1 2026-08-19 23:35:27.859 INFO [Server] Node.js Version: v20.20.2 2026-08-19 23:35:27.859 INFO [Server] Platform: linux 2026-08-19 23:35:27.859 INFO [Server] Arch: x64 2026-08-19 23:35:27.861 INFO [Database] Initializing db at "/config/absdatabase.sqlite" 2026-08-19 23:35:27.875 INFO [Database] Loading extension /usr/local/lib/nusqlite3/libnusqlite3.so 2026-08-19 23:35:27.875 INFO [Database] Successfully loaded extension /usr/local/lib/nusqlite3/libnusqlite3.so 2026-08-19 23:35:27.876 INFO [Database] Db supports unaccent and unicode foldings 2026-08-19 23:35:27.876 INFO [Database] Db connection was successful 2026-08-19 23:35:27.883 INFO [MigrationManager] Database is already up to date. 2026-08-19 23:35:28.148 INFO [Database] Db initialized with models: user, session, apiKey, library, libraryFolder, book, podcast, podcastEpisode, libraryItem, mediaProgress, series, bookSeries, author, bookAuthor, collection, collectionBook, playlist, playlistMediaItem, device, playbackSession, feed, feedEpisode, setting, customMetadataProvider, mediaItemShare 2026-08-19 23:35:28.194 INFO [Database] running ANALYZE 2026-08-19 23:35:28.215 INFO [Database] ANALYZE completed 2026-08-19 23:35:28.216 INFO [LogManager] Init current daily log filename: 2026-08-19.txt 2026-08-19 23:35:28.229 INFO [BackupManager] 0 Backups Found 2026-08-19 23:35:28.230 INFO [BackupManager] Auto Backups are disabled 2026-08-19 23:35:28.248 INFO [Watcher] Initializing watcher for "Audible". 2026-08-19 23:35:28.265 INFO Listening on port :80 2026-08-19 23:35:28.271 INFO [Watcher] "Audible" Ready 2026-08-19 23:35:33.272 INFO [SocketAuthority] Socket Connected to /audiobookshelf/socket.io W9Crhxoi3PoohLLiAAAB 2026-08-19 23:41:56.329 INFO [LibraryScanner] Starting library scan 47187142-08ca-40b2-bccf-7a323e5dea7c for Audible 2026-08-19 23:41:56.343 ERROR Root path has no media folders: /audiobooks 2026-08-19 23:41:56.344 INFO [LibraryScanner] Library scan "47187142-08ca-40b2-bccf-7a323e5dea7c" completed in 0:00 | 0 Added | 0 Updated | 0 Missing 2026-08-19 23:41:56.369 INFO [LibraryController] Scan complete 2026-08-19 23:41:56.369 INFO [LibraryScan] Scan log saved "/metadata/logs/scans/2026-08-1947187142-08ca-40b2-bccf-7a323e5dea7c.txt" Now, another challenge I have come across in sparkbox doctor is sb-proxy warning, I don't know how to enable UFW: grep DEFAULTFORWARDPOLICY /etc/default/ufw (should be ACCEPT) and sudo sparkbox repair-network did not repair the problem and there is a port conflict with Nginx. How can I see all the ports that are currently running so that I can choose a port that won't create a conflict with sparkbox dashboard. Full logs below... @DXP4800:/$ sudo sparkbox doctor / | | | | ) \ \| ' \ / | '| |/ / \ / \ \/ / ) | |) | (| | | | <| |) | () < |/| ./ \,|| ||\\/ \//\\ || SparkBox v1.6.551 - Self-Hosted Privacy Stack Created by Tom Spark | youtube.com/@TomSparkReviews Environment: NAS (ugreen) SparkBox Doctor Running diagnostics... [Install location] [OK] SparkBox is installed at: /opt/sparkbox [OK] Settings file (.env): /opt/sparkbox/.env [OK] Media library folder (MEDIAROOT): /volume1/ [Docker] [OK] Docker daemon is accessible [OK] Docker version: Docker version 29.4.3, build 055a478 [OK] Docker Compose: 5.1.3 [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=999 (containers run as UID 999) [OK] PGID=10 (containers run as GID 10) [Container Egress] [WARN] The apps' network (sbproxy) cannot reach tomsparkbox.com. This is the network every SparkBox app runs on, including the reverse proxy — so anything that fetches from the internet (certificates, metadata, indexers, updates) will fail. It also stops the reverse proxy (sb-npm) finishing its startup: NPM downloads an IP-range list from Amazon the moment it boots, and with no way out that download never answers, so it waits there forever. The container stays 'Up (unhealthy)' and its log ends mid-line at 'Fetching IP Ranges from online services'. Nothing is wrong with NPM; fix egress below and it finishes booting. To fix container egress: 1. UFW: grep DEFAULTFORWARDPOLICY /etc/default/ufw (should be ACCEPT) 2. Run: sudo sparkbox repair-network (re-tests egress itself; exits without touching your apps if the network is not the problem) 3. If you have a custom /etc/docker/daemon.json, check its DNS settings. Re-run 'sparkbox doctor' to verify. [WARN] Docker's default bridge cannot reach tomsparkbox.com. What this breaks: the dashboard's one-click Update button. It downloads from inside a helper container on that bridge, so it fails with 'Could not resolve host: get.tomsparkbox.com'. Optional Pro-tier license activation won't work either. Updating over SSH still works — that downloads on the host: sudo sparkbox upgrade Same fixes as above (UFW forward policy, sparkbox repair-network). [Port Conflicts] [OK] Port 8080 (Nginx Proxy Manager (custom domains + HTTPS)): available [WARN] Port 443: in use by another program on this box (not SparkBox) LISTEN 0 511 0.0.0.0:443 0.0.0.0: users:(("nginx",pid=24032,fd=8),("nginx",pid=24031,fd=8),("nginx",pid=24030,fd=8),("nginx",pid=24029,fd=8),("nginx",pid=24028,fd=8),("nginx",pid=24027,fd=8),("nginx",pid=3437,fd=8)) Affects: Nginx Proxy Manager (custom domains + HTTPS) — the https:// address for your apps will not answer. Fix: move Nginx Proxy Manager (custom domains + HTTPS) to a free port (nothing is lost, it just answers somewhere else) — Dashboard → Settings → Ports → 'HTTPS Port', then Save; or on the server: sudo sparkbox set-env HTTPSPORT <a free port sudo sparkbox up Or leave it: the rest of SparkBox is unaffected by this one port. [OK] Port 8443: in use by SparkBox (sb-dashboard) [OK] Port 9000: in use by SparkBox (sb-portainer) [OK] Port 53: in use by SparkBox (sb-pihole) [Portainer Auth] [OK] Portainer admin login verified (HTTP 200) [VPN Tunnel] [OK] Gluetun tunnel is healthy [Hardware Transcoding] [OK] /dev/dri exists -- GPU devices detected total 0 drwxr-xr-x 3 root root 100 Aug 7 23:27 . drwxr-xr-x 20 root root 7840 Aug 7 23:27 .. drwxr-xr-x 2 root root 80 Aug 7 23:27 by-path crw-rw---- 1 root video 226, 0 Aug 7 23:27 card0 crw-rw---- 1 root render 226, 128 Aug 7 23:27 renderD128 [OK] Intel Quick Sync / GPU render device available (renderD128) [OK] Render device is accessible by current user [OK] sb-jellyfin-media is in the host's real render group (105) [Media Storage] [OK] MEDIAROOT=/volume1/ exists [OK] MEDIAROOT is writable [OK] Your apps (user id 999) can read your media library [INFO] Free space at MEDIAROOT: 15841GB [System Resources] [INFO] Total RAM: 64085MB [INFO] Available RAM: 52626MB [OK] RAM looks sufficient for 6 enabled modules [INFO] Free disk at SBROOT: 91GB [NAS-Specific] [INFO] NAS type: ugreen [INFO] Install directory: /opt/sparkbox [WARN] Install directory is on system partition -- consider moving to a data volume There is no one-shot move command. The supported route is: 1. sudo sparkbox backup 2. copy the archive somewhere off this partition 3. re-install with: --install-dir <path on your data volume 4. sudo sparkbox restore <archive Restore now rewrites SBROOT in the settings file to the new location. [Container Health] [ERROR] sb-seerr is stuck in a crash-restart loop (9 restarts so far) │ } │ │ Node.js v22.22.2 Try: sudo sparkbox up (and 'sparkbox logs <name' to see why a container is unhappy) ============================================ 4 issue(s) found. Review warnings above and fix as needed. ============================================ alvaro@DXP4800:/$ sparkbox UFW forward policy Also TomAI isn't active still. I think the system wants me to use a new activation since I nuked the previous activation...
Chris wrote:
Good news — Audiobookshelf doesn't read Jellyfin's MEDIAROOT, so that's not the blocker. It has its own dedicated audiobooks folder (plus a separate podcasts one), and 'Root path has no media folders: /audiobooks' just means that folder is empty. Easiest fix: open the Files app in your dashboard, find the audiobooks folder, and drag your book folders in — one folder per book. Then in Audiobookshelf, point the library at /audiobooks and it'll scan them in. To list listening ports, run sudo ss -tlnp — the 443 clash is your UGREEN's own nginx; move NPM's HTTPS port under Settings → Ports. I'm flagging the Tom AI license issue to Tom now.