I just runned the install command on my dxp4800, and it installed no problem. However, the setup wizard did not pop up, and I can't change the networkserver config settings (I get this error: Invalid path for "MEDIAROOT": path must start with one of: /opt/sparkbox, /mnt, /media, /srv, /data, /home) I used sudo mkdir -p /volume1/data/{torrents/{movies,tv,music},media/{movies,tv,music}} sudo chown -R $(id -u):$(id -g) /volume1/data sudo chmod -R 775 /volume2/data to create the folder structure, changing to volume 2, as volume 1 is my ssd for programs.
11 replies
tomspark wrote:
That's our bug, not your setup — and a real one since you're on exactly the hardware SparkBox targets. UGREEN's UGOS mounts storage pools at /volume1, /volume2, etc., but the dashboard's path validator only allowed /opt/sparkbox, /mnt, /media, /srv, /data, /home — so /volume2/data got wrongly rejected. Just shipped v1.6.114 that accepts /volumeN paths. Grab it: sudo sparkbox update (or re-run the install command), then set MEDIAROOT=/volume2/data in the dashboard and it'll save. If you want it working before updating, you can also set MEDIAROOT directly in /opt/sparkbox/.env over SSH (the CLI doesn't enforce that allowlist, only the dashboard form did) then sudo sparkbox up. Separately — the setup wizard not popping up on first boot is a different thing. Paste sudo docker logs sb-dashboard --tail 30 and I'll see whether it's the permissions issue we patched earlier this week or something new on your install.
illien wrote:
The MEDIAROOT issue is fixed, thanks! Here is the log output: sudo docker logs sb-dashboard --tail 30 [2026-05-15T18:29:52.779Z] [INFO] License tier (cached): unlicensed [2026-05-15T18:29:52.780Z] [INFO] Backup encryption: dedicated key [health-report] Weekly report scheduler started (Sundays 8 AM). [knowledge-miner] Initialized. Daily mining at 4:00 AM. [2026-05-15T18:29:53.079Z] [WARN] [perms] could not chmod .env-hash: EPERM: operation not permitted, chmod '/app/state/.env-hash' [2026-05-15T18:29:53.080Z] [INFO] [perms] migrated authelia-admin-password.txt from 664 to 600 [2026-05-15T18:29:53.080Z] [INFO] [perms] migrated duplicati-admin-password.txt from 664 to 600 [2026-05-15T18:29:53.080Z] [INFO] [perms] migrated filebrowser-admin-password.txt from 664 to 600 [2026-05-15T18:29:53.080Z] [INFO] [perms] migrated gotify-admin-password.txt from 664 to 600 [2026-05-15T18:29:53.080Z] [INFO] [perms] migrated install-meta.conf from 664 to 600 [2026-05-15T18:29:53.080Z] [INFO] [perms] migrated linkding-admin-password.txt from 664 to 600 [2026-05-15T18:29:53.080Z] [INFO] [perms] migrated modules.conf from 664 to 600 [2026-05-15T18:29:53.081Z] [INFO] [perms] migrated pihole-admin-password.txt from 664 to 600 [2026-05-15T18:29:53.081Z] [INFO] [perms] migrated portainer-admin-password.txt from 664 to 600 [2026-05-15T18:29:53.081Z] [INFO] [perms] migrated qbittorrent-admin-password.txt from 664 to 600 [2026-05-15T18:29:53.081Z] [INFO] [perms] migrated vaultwarden-admin-password.txt from 664 to 600 [2026-05-15T18:29:53.081Z] [INFO] [perms] state/ permission migration: 11 file(s) locked to 0600 [alerts] Service health monitor started (30s interval; requires valid license). Error: ENOENT: no such file or directory, rename '/app/state/sessions/8gShTHo04ZlmJxkVbrvVJoqXwuAMRsr.json.1.1778869820237.tmp' - '/app/state/sessions/8gShTHo04ZlmJxkVbrvVJoqXwuAMRsr.json' at async Object.rename (node:internal/fs/promises:780:10) Error: ENOENT: no such file or directory, rename '/app/state/sessions/8gShTHo04ZlmJxkVbrvVJoqXwuAMRsr.json.1.1778869820280.tmp' - '/app/state/sessions/8gShTHo04ZlmJxkVbrvVJoqXwuAMRsr.json' at async Object.rename (node:internal/fs/promises:780:10) Error: ENOENT: no such file or directory, rename '/app/state/sessions/8gShTHo04ZlmJxkVbrvVJoqXwuAMRsr.json.1.1778869820306.tmp' - '/app/state/sessions/8gShTHo04ZlmJxkVbrvVJoqXwuAMRsr.json' at async Object.rename (node:internal/fs/promises:780:10) Error: ENOENT: no such file or directory, rename '/app/state/sessions/8gShTHo04ZlmJxkVbrvVJoqXwuAMRsr.json.1.1778869820382.tmp' - '/app/state/sessions/8gShTHo04ZlmJxkVbrvVJoqXwuAMRsr.json' at async Object.rename (node:internal/fs/promises:780:10) [config] atomic .env write unavailable (EACCES); falling back to direct write — partial-write protection reduced [config] atomic .env write unavailable (EACCES); falling back to direct write — partial-write protection reduced [2026-05-15T18:30:47.700Z] [INFO] Wizard: modules.conf already matches profile=essentials, skipping write + sparkbox up [2026-05-15T18:30:47.708Z] [INFO] Setup complete — detached sparkbox up (pid=40)
tomspark wrote:
That log nails it — and it's a separate bug from the /volume path one. Two linked failures: 1. ENOENT ... rename '...json.tmp' - '...json' (repeating) — the session store writes a temp file then atomically renames it; the rename keeps failing. That's why the wizard appears broken: your browser session never persists, so every step resets you. 2. could not chmod .env-hash: EPERM + atomic .env write unavailable (EACCES) — same underlying cause. This pattern means /opt/sparkbox/state landed on a filesystem that doesn't support POSIX atomic-rename + chmod the way SparkBox expects — typical of exFAT/NTFS externals, fuse mounts, or some btrfs subvol layouts. You did a custom volume setup, so paste these and I'll see exactly where it is: df -T /opt/sparkbox/state mount | grep -E 'opt/sparkbox|volume' This is our robustness gap to fix — the session store should degrade gracefully like the .env writer already does. The filesystem type just tells me which way to patch it.
illien wrote:
df -T /opt/sparkbox/state mount | grep -E 'opt/sparkbox|volume' Filesystem Type 1K-blocks Used Available Use% Mounted on overlay overlay 111896192 5118892 101047136 5% / /dev/mapper/ugA9E1281777486161pool1-volume1 on /volume1 type btrfs (rw,relatime,ssd,discard=async,spacecache=v2,subvolid=5,subvol=/) /dev/mapper/ugA9E1281777486650pool2-volume1 on /volume2 type btrfs (rw,relatime,spacecache=v2,subvolid=5,subvol=/) /dev/mapper/ugA9E1281777486650pool2-volume1 on /home type btrfs (rw,relatime,spacecache=v2,subvolid=256,subvol=/@home) overlay on /volume1/@docker/overlay2/7bb34c910a2c1b34ba336efe5227a195c341ed6cb86b26a5d596951ffa6c7a15/merged type overlay (rw,relatime,lowerdir=/volume1/@docker/overlay2/l/ZPYI7ENKFMQPZHKFHYO7DPIU4S:/volume1/@docker/overlay2/l/PEHNXPMRH4T2DMSS42HDZGJEQZ:/volume1/@docker/overlay2/l/E7V56C7TIHQZU7WE7F5I5LGZK6,upperdir=/volume1/@docker/overlay2/7bb34c910a2c1b34ba336efe5227a195c341ed6cb86b26a5d596951ffa6c7a15/diff,workdir=/volume1/@docker/overlay2/7bb34c910a2c1b34ba336efe5227a195c341ed6cb86b26a5d596951ffa6c7a15/work) overlay on /volume1/@docker/overlay2/9cb5e1ca4cd2fadaa0334222b58e76282b1232a79c08b5f7c5c858936f5c2d65/merged type overlay (rw,relatime,lowerdir=/volume1/@docker/overlay2/l/TZUCKSH2R3VXPHIWFFDRA65RXN:/volume1/@docker/overlay2/l/UJHMSD7OLMG4M4CYPMJRLGYM3K:/volume1/@docker/overlay2/l/4N3HB3A3TY4IFSI36DIDICBQHP:/volume1/@docker/overlay2/l/CHPHI2KW2JUNIKZRXFI45UTX56:/volume1/@docker/overlay2/l/5LYD4Y6IFW7FGEKQASZWTPISV3:/volume1/@docker/overlay2/l/ENJWNUNBVKHARF7GFUHBLWJQYH:/volume1/@docker/overlay2/l/YHTQBJSHP5M22VCCKTY2N4AG23:/volume1/@docker/overlay2/l/DEYBVJFDX2KZ3GCJW4QUGKBCIF:/volume1/@docker/overlay2/l/6EYBO7UQUE2PVX2Z34JMOFPNRH:/volume1/@docker/overlay2/l/WPRJ6TVEC6KBVQN7KXWDMMEITC:/volume1/@docker/overlay2/l/E7V56C7TIHQZU7WE7F5I5LGZK6,upperdir=/volume1/@docker/overlay2/9cb5e1ca4cd2fadaa0334222b58e76282b1232a79c08b5f7c5c858936f5c2d65/diff,workdir=/volume1/@docker/overlay2/9cb5e1ca4cd2fadaa0334222b58e76282b1232a79c08b5f7c5c858936f5c2d65/work) overlay on /volume1/@docker/overlay2/fd7b0d6aa9c3fa4ed62980531367eb152639100cb124c23f0c505a8a044bdb1f/merged type overlay (rw,relatime,lowerdir=/volume1/@docker/overlay2/l/XQSUTNWICOYW4LRK6UBT4TRMF7:/volume1/@docker/overlay2/l/UHKJJF7RLJL2QYVMAXO3WCHIPQ:/volume1/@docker/overlay2/l/TITKO7UCQR2XPANTPKU2B2AJQ3:/volume1/@docker/overlay2/l/KF7XCNMYWSWMFK7IPEAH5KLVHN:/volume1/@docker/overlay2/l/S2CRIMRKPDUQUUERTGTMI5ZDJQ:/volume1/@docker/overlay2/l/7CVETZOKOT42PL4IUBK54V5VEB:/volume1/@docker/overlay2/l/J23M5JLRVGXPB7FYDVMZF3JSK5:/volume1/@docker/overlay2/l/ZEFGDSUVYYOSHTRTMOEKJ5NHZW:/volume1/@docker/overlay2/l/NKASMRACJEZ74P6THGHOOEYQDE,upperdir=/volume1/@docker/overlay2/fd7b0d6aa9c3fa4ed62980531367eb152639100cb124c23f0c505a8a044bdb1f/diff,workdir=/volume1/@docker/overlay2/fd7b0d6aa9c3fa4ed62980531367eb152639100cb124c23f0c505a8a044bdb1f/work) overlay on /volume1/@docker/overlay2/5a5e93090b19d16f4df36fc74348d6257f23d261eea37bf7aadb0a86c605efbc/merged type overlay (rw,relatime,lowerdir=/volume1/@docker/overlay2/l/N4D7LZC23UNA2BVXOWPGE7OKII:/volume1/@docker/overlay2/l/3KT5TONKFIDPU6ERE26C6XEG7X:/volume1/@docker/overlay2/l/7AVHOJ6DWRS4KZHTO22ARUIYHC:/volume1/@docker/overlay2/l/C7SEDCXXFY56SRMVOPHIAKKSTS:/volume1/@docker/overlay2/l/4I7GT23GDF4PSB6RIY45NL62V7:/volume1/@docker/overlay2/l/FLCRTJGJ4LZWYWNRMRM2LGRMQO:/volume1/@docker/overlay2/l/C3X775YOM3USWU5XFGPLJGUESO:/volume1/@docker/overlay2/l/JWYBB2LBKMF6K3D4F5G2D3L5IH:/volume1/@docker/overlay2/l/ARTXV7BBWCGHXQIKF2NMDZYJ53:/volume1/@docker/overlay2/l/URJFSDOWNFYJZ5PXU53KGUJISI:/volume1/@docker/overlay2/l/DBVJW6ON6XIAV5XATCDGXCQKKN:/volume1/@docker/overlay2/l/E7V56C7TIHQZU7WE7F5I5LGZK6,upperdir=/volume1/@docker/overlay2/5a5e93090b19d16f4df36fc74348d6257f23d261eea37bf7aadb0a86c605efbc/diff,workdir=/volume1/@docker/overlay2/5a5e93090b19d16f4df36fc74348d6257f23d261eea37bf7aadb0a86c605efbc/work) overlay on /volume1/@docker/overlay2/dad797f084289d6455cbf8dc033eb4441334e106f6ee8d5479503fae8df52e6b/merged type overlay (rw,relatime,lowerdir=/volume1/@docker/overlay2/l/TCIHHKSX5UAVK36TTDE3ZCFIXJ:/volume1/@docker/overlay2/l/RPOR3TJ7IEPW744NPKZ2XUIFLD:/volume1/@docker/overlay2/l/ICZXF54OPXF2PRZB7R7GB5JUN2:/volume1/@docker/overlay2/l/GSCPZELES6DJEL53O5ZZB3K74H:/volume1/@docker/overlay2/l/VKANL7LVUHVO3FOLO75OMGRSSU:/volume1/@docker/overlay2/l/UMQKZGWRDLFFGWPCFOW7XSUCF3:/volume1/@docker/overlay2/l/727DN4YTOMSIFOM7JNJBEYLLU6:/volume1/@docker/overlay2/l/24PBPNXXL7RO2SB67XSKCEMIET:/volume1/@docker/overlay2/l/NI36FVH27M63XHSYQH7ET6VT3E:/volume1/@docker/overlay2/l/LM4WUTLAWBR4MPOUHU572XPJ4D:/volume1/@docker/overlay2/l/2AIXXEBCYJ3VK7W3X5N2SU3WU7:/volume1/@docker/overlay2/l/Z4TVXMS2UNFEZ2XW3D7F2QUM5P:/volume1/@docker/overlay2/l/VUMTBOJYQOBH6ICE3QXFCB4DLY:/volume1/@docker/overlay2/l/2B62ZSZE4HKXI777V6YEKI5DYE:/volume1/@docker/overlay2/l/EG5PFVH6G2P6RHA2XWEY65IQGJ:/volume1/@docker/overlay2/l/KU4ULBMMNI72LZXNHT267D6K57:/volume1/@docker/overlay2/l/WGFKMLBQ2L3CO45JRQHS6WJ227:/volume1/@docker/overlay2/l/337WWMI6BAYQXYJUK72RO4MLJN:/volume1/@docker/overlay2/l/JDLOHJHVKNU3CP5DUGGM5PXIHD:/volume1/@docker/overlay2/l/J6NU63OD6ASTA4WI3BI6ONG2YB:/volume1/@docker/overlay2/l/MYLIK2KESYR235W4JST7464UGT:/volume1/@docker/overlay2/l/JHMGTED4H66U37PY63C25XPLLL:/volume1/@docker/overlay2/l/MAFY6WAJP4QKDHFBGSOG7JFGJ4:/volume1/@docker/overlay2/l/25BAE5TYVZYBW6VP5JMRUC36ID:/volume1/@docker/overlay2/l/FOFSYQNXJOXFBNIEDW2ACG6UMZ:/volume1/@docker/overlay2/l/3K7XDOAEWPNTHNFIRWPQH5KKGN:/volume1/@docker/overlay2/l/U76T6Z3XGBKBQLE4Q5QST3DIEM:/volume1/@docker/overlay2/l/3HZD53674EBF2JLJA2XOWWBDB6,upperdir=/volume1/@docker/overlay2/dad797f084289d6455cbf8dc033eb4441334e106f6ee8d5479503fae8df52e6b/diff,workdir=/volume1/@docker/overlay2/dad797f084289d6455cbf8dc033eb4441334e106f6ee8d5479503fae8df52e6b/work) overlay on /volume1/@docker/overlay2/8ba0a4b4ef3be92279b681d9132e0205c6b217d984fddae4e3af81d798252fec/merged type overlay (rw,relatime,lowerdir=/volume1/@docker/overlay2/l/MN62PXOQIKMMXAX4MR2HTP4P7A:/volume1/@docker/overlay2/l/JXXSMAI2ZKNTNKAULRWLWRR56D:/volume1/@docker/overlay2/l/3H3RBBRG45LPELKK3KX2A26R4S:/volume1/@docker/overlay2/l/NZCSCSDLKYIBBU3GFKIWD53QYE:/volume1/@docker/overlay2/l/VXGLGGYTL2OARSCY32NJSMA77X:/volume1/@docker/overlay2/l/LPUK3CONOGDHGI5CQRJ677IDYK:/volume1/@docker/overlay2/l/74UTRNCLR772OQWJVYBVS56TKO:/volume1/@docker/overlay2/l/GOD5ECN3KGEHC4AGMLS5Z5K3RI:/volume1/@docker/overlay2/l/PCQBTINOZDZGYMJIVDQVRP5BRV,upperdir=/volume1/@docker/overlay2/8ba0a4b4ef3be92279b681d9132e0205c6b217d984fddae4e3af81d798252fec/diff,workdir=/volume1/@docker/overlay2/8ba0a4b4ef3be92279b681d9132e0205c6b217d984fddae4e3af81d798252fec/work) overlay on /volume1/@docker/overlay2/109009ca134d2ede4d4bc066df6427436155d5de119cd29dfad6f0bf38bb7923/merged type overlay (rw,relatime,lowerdir=/volume1/@docker/overlay2/l/WEE5PK6ADDEMIB7PZTYYZJWTW7:/volume1/@docker/overlay2/l/UJHMSD7OLMG4M4CYPMJRLGYM3K:/volume1/@docker/overlay2/l/4N3HB3A3TY4IFSI36DIDICBQHP:/volume1/@docker/overlay2/l/CHPHI2KW2JUNIKZRXFI45UTX56:/volume1/@docker/overlay2/l/5LYD4Y6IFW7FGEKQASZWTPISV3:/volume1/@docker/overlay2/l/ENJWNUNBVKHARF7GFUHBLWJQYH:/volume1/@docker/overlay2/l/YHTQBJSHP5M22VCCKTY2N4AG23:/volume1/@docker/overlay2/l/DEYBVJFDX2KZ3GCJW4QUGKBCIF:/volume1/@docker/overlay2/l/6EYBO7UQUE2PVX2Z34JMOFPNRH:/volume1/@docker/overlay2/l/WPRJ6TVEC6KBVQN7KXWDMMEITC:/volume1/@docker/overlay2/l/E7V56C7TIHQZU7WE7F5I5LGZK6,upperdir=/volume1/@docker/overlay2/109009ca134d2ede4d4bc066df6427436155d5de119cd29dfad6f0bf38bb7923/diff,workdir=/volume1/@docker/overlay2/109009ca134d2ede4d4bc066df6427436155d5de119cd29dfad6f0bf38bb7923/work) overlay on /volume1/@docker/overlay2/39b633e0a80ab898950f74d4183cb0013a0d6c844732d86dbe5898c92249f5fd/merged type overlay (rw,relatime,lowerdir=/volume1/@docker/overlay2/l/U3P7TRFYJDRFJZY6D5PGKIFUVL:/volume1/@docker/overlay2/l/ZGCHD5KLCKMMLRBU5QB7WLL76U:/volume1/@docker/overlay2/l/T5GPFTTGPMWZY3BS3SZ6G4IUIO:/volume1/@docker/overlay2/l/JQWIH7GNOYKLFXDJGNKPLUBQ55:/volume1/@docker/overlay2/l/2TYXTDRTV4ITATQL3PZZ5FS4IL:/volume1/@docker/overlay2/l/GHQ25TUI33RNZSXP3Z7FQ5JNQL:/volume1/@docker/overlay2/l/HSB22JHMH5HB7O4FHDSMKBYVNI:/volume1/@docker/overlay2/l/ZK6Y2XCJY2HKIVZ4CZXXVPNBGV:/volume1/@docker/overlay2/l/4I47NDQ45KZLPOJTMXERLUQA2X:/volume1/@docker/overlay2/l/IJSE4ND4PH26OZADBA45EY2IAE:/volume1/@docker/overlay2/l/SUG7TWPBHSRAPO72OAWWEA7GHP:/volume1/@docker/overlay2/l/OAOYAS3H2KHRI6L345YE2EL3QA:/volume1/@docker/overlay2/l/JH6DI6ATZYF6TTSI5PBIEFFXLQ:/volume1/@docker/overlay2/l/VFESTVQQINALRPAI7AVV4EWDP4:/volume1/@docker/overlay2/l/NNBQFJGCAEXXTMSTIONCIU2V5X:/volume1/@docker/overlay2/l/G4FLT2IQSQYW3I2RXK7CVGHD7G:/volume1/@docker/overlay2/l/UCHHVDON2ODVMBZ6N77JBJA2WW:/volume1/@docker/overlay2/l/L7NVHX4EY5LSHRQD47YL77CAUX:/volume1/@docker/overlay2/l/PBXN3UGGMMIDOA7SD7YLINZC6D:/volume1/@docker/overlay2/l/OSOXYVUHNC5BNLSSQBDTMJBENR:/volume1/@docker/overlay2/l/6Z6LREZ66GMRDVMK4HI3DJHK3L:/volume1/@docker/overlay2/l/P3MESDNQC4YGYJFMMSU6XUU37U:/volume1/@docker/overlay2/l/CE7DZOHUQF4FSSRL5QKQRKKTMM:/volume1/@docker/overlay2/l/QKDKGZZACILQTALPP5SWTCNQ4I:/volume1/@docker/overlay2/l/5MTWCLKBLAP2UM6G2GNWCQCMA6:/volume1/@docker/overlay2/l/HLQBQAP2VKAEC6DNG6HJO75MHD:/volume1/@docker/overlay2/l/AIFINGZ6MBXTCMDAQQT2PD74U3:/volume1/@docker/overlay2/l/SFUBYA27IGAFJB7LYTAMAYFRST:/volume1/@docker/overlay2/l/KF6CHXIZGAVP3THMLHJK4TKXGE:/volume1/@docker/overlay2/l/UX5CWLGPZ6SJGCJ6ZHNBIR6D3I:/volume1/@docker/overlay2/l/PFIPRCSSRIQP4QSQTMINO45I6Q:/volume1/@docker/overlay2/l/4JZ5U2PTQKEMCGQXN6O7BLKPQO:/volume1/@docker/overlay2/l/ERMLUVBMRMIRT7HXWE5XW2W2F4:/volume1/@docker/overlay2/l/23DVCQEUCKQKXCLWWWKMOJPATO,upperdir=/volume1/@docker/overlay2/39b633e0a80ab898950f74d4183cb0013a0d6c844732d86dbe5898c92249f5fd/diff,workdir=/volume1/@docker/overlay2/39b633e0a80ab898950f74d4183cb0013a0d6c844732d86dbe5898c92249f5fd/work) overlay on /volume1/@docker/overlay2/6339bde9e9ded4922670b36a8a9c4a032b25ef0a96da70f322950b5ac0490cb8/merged type overlay (rw,relatime,lowerdir=/volume1/@docker/over
tomspark wrote:
Found it, and thank you for the full output. df -T /opt/sparkbox/state returns overlay — meaning /opt/sparkbox is sitting on the UGOS root overlay filesystem, not on either of your btrfs pools. Your real persistent storage is only mounted at /volume1, /volume2, /home; nothing lives under /opt. That's the whole chain: - overlay doesn't honor the atomic write-tmp-then-rename the session store and .env writer depend on → the repeating ENOENT/EACCES → your wizard session never persists → wizard appears dead. - chmod from the container hits EPERM for the same reason. - And /opt on the UGOS overlay isn't where SparkBox's data should live long-term anyway — it belongs on a btrfs pool. This is our install-location bug on UGREEN hardware, not anything you did — I'm escalating it internally. Immediate fix for you: reinstall with the data dir pointed at a real volume (e.g. /volume1/sparkbox), or move /opt/sparkbox onto /volume1 and symlink it back. Given your layout (apps on volume1, media on volume2) I can write the exact reinstall steps — want them?
tomspark wrote:
Quick honesty correction before I send you down a path: I dug into our own install logic and it turns out /volume1 is NOT a safe target either. SparkBox deliberately installs to /opt on UGOS precisely because UGOS treats /volume1/ as a managed share folder and periodically clamps everything under it to mode 0000 — which kills the bind-mounted dashboard code. So a naive reinstall to /volume1/sparkbox would likely just swap your overlay-rename failure for a worse perms-clamp failure. Your box has exposed a real dilemma: /opt is overlay (breaks atomic writes) AND /volume1 gets perm-clamped. Both paths our installer assumes are safe are broken on your UGOS config. I don't want to hand you reinstall steps that make it worse — this needs a proper fix on our side, which I've escalated as a priority. Please hold off reinstalling for now; your data's fine where it is, the wizard's just blocked. I'll follow up here with a verified path rather than guess. Sorry for the earlier over-confident answer — better to get this right than fast.
illien wrote:
What should I do then? Better wait for you to fix - reinstall or I can safely do the setup configuration manually in settings?
tomspark wrote:
Good question — you do have an interim path that skips the broken wizard entirely. The wizard's dead because the session store can't persist, but two things still work on your box: the sparkbox CLI (doesn't touch the session store) and direct .env editing (that writer already degrades gracefully — you saw 'falling back to direct write' in your own logs). So you can configure everything over SSH: edit /opt/sparkbox/.env for MEDIAROOT etc., enable modules via the sparkbox CLI, then sudo sparkbox up. Apps run fine; only the dashboard web UI stays degraded. But ONE check decides whether that's worth your time. Is /opt actually persistent on your UGOS, or does the overlay reset on reboot? Test it: touch /opt/sparkbox/PERSISTTEST sudo reboot When it's back, check whether /opt/sparkbox/PERSISTTEST still exists. Survives - manual SSH config is a solid interim, go for it. Gone - /opt is ephemeral, don't invest in manual config (it'd vanish on the next reboot/firmware update anyway) — wait for the relocate fix. That single test tells us if your install location is even viable, which also directly informs the fix on our end. Paste the result either way.
illien wrote:
It persists. Is there a way I can launch the wizard manually?
tomspark wrote:
Persists — that's the good news, it means this is NOT a data-loss situation, just the atomic-write incompatibility. Your config will survive reboots fine. And yes: sudo sparkbox config runs the exact same setup wizard in your terminal (the blue-screen TUI). It does everything the dashboard wizard does — pick modules, set MEDIAROOT/timezone, write the config, bring the stack up — but it's a terminal flow, so it completely sidesteps the broken dashboard session store. That's your clean path: ssh into the box sudo sparkbox config Work through it, and at the end it writes modules.conf + .env and runs sparkbox up. Your apps come up normally. The dashboard web UI stays degraded (the session store still can't persist on the overlay /opt) — but you don't need it for setup or for the apps themselves; each app has its own UI on its own port. Your persist result also scoped our fix nicely: it's not a relocate, just making the session store degrade gracefully like the .env writer already does. That's logged and prioritized. Run sparkbox config and tell me if anything in the TUI trips.