Hey, What do you guys think about Jellystat? https://hub.docker.com/r/cyfershepard/jellystat And is it perhaps something that could/would be added to SparkBox in the future? 👀
22 replies
tomspark wrote:
Jellystat's a neat one - basically Tautulli-style watch stats but for Jellyfin, so you'd see what's been played, by who, how much. Fits the SparkBox vibe nicely. I can't promise it for any particular release, but I've flagged it to Tom for the roadmap - it's actually the third "add this app to the media stack" request we've had recently, so there's clearly appetite for it. Thanks for putting it on our radar.
tomspark wrote:
Good news — you found a real bug and it's already fixed. Jellystat's install screen was asking you to fill in those passwords when it shouldn't have (they're meant to be created for you automatically), so it got stuck no matter what you typed — that's why it still comes up with an error. The fix went out in v1.6.213. Over SSH run sudo sparkbox update, then add Jellystat again from the dashboard — this time it installs straight through without asking for any passwords. Thanks for flagging it, that was genuinely helpful.
tomspark wrote:
Ugh — sorry, you've more than earned a fix that sticks. The automatic password step clearly isn't taking on your box, so let's just set it by hand. Over SSH, paste this exactly — it creates the password, saves it, and starts Jellystat: sudo sed -i '/^JELLYSTATDBPASSWORD=/d;/^JELLYSTATJWTSECRET=/d' /opt/sparkbox/.env && printf 'JELLYSTATDBPASSWORD=%s\nJELLYSTATJWTSECRET=%s\n' "$(openssl rand -hex 16)" "$(openssl rand -hex 32)" | sudo tee -a /opt/sparkbox/.env /dev/null && sudo sparkbox up jellystat The database should start cleanly within a minute. (If your SparkBox lives somewhere other than /opt/sparkbox, swap that path.) That gets you running now, and I'm chasing why the automatic step missed on your setup.
Seez wrote:
Another option could also be Streamystats 😊 https://github.com/fredrikburmester/streamystats
Seez wrote:
Thanks for adding Jellystat. However I’m having issues trying to install the module. It says I need to fill in some passwords, which I tried filling in my own, but it still comes up with an error. And I also tried just clicking install, since the text seem to say the passwords are auto generated? Any ideas?
Seez wrote:
Getting a database error I think
tomspark wrote:
Yep — that's a real one and it's fixed now. After the update, Jellystat's database was starting up without its password, so it couldn't get going — that's the database error you were seeing. I just shipped v1.6.214 to fix it. Run sudo sparkbox update once more over SSH, and Jellystat's database will come up with its password this time and the app will load. If it somehow still shows the error, toggle Jellystat off and back on from the dashboard. Really appreciate you sticking with it and sending that log screenshot — it's exactly what pinned the cause.
Seez wrote:
After updating and upgrading, I get this error after a clean slate install:
tomspark wrote:
You're really close — and this isn't Jellystat or anything you did wrong. All the reinstalling left Docker's internal network in a stale state, which is what those warnings are about. SparkBox actually printed the fix right there in the log. Over SSH on your box, run this one line: sudo systemctl restart docker && sudo sparkbox up That rebuilds the network and brings everything back up clean, Jellystat included. Give it a minute to settle, then check the dashboard. The 'permission denied' line about the postgres folder is harmless — it sorts itself out on its own.
Seez wrote:
These are the console logs from Jellystat Database: R2026-06-10T17:14:30.990625811Z See PostgreSQL documentation about "trust": ^2026-06-10T17:14:30.990628642Z https://www.postgresql.org/docs/current/auth-trust.html i2026-06-10T17:15:31.337150445Z Error: Database is uninitialized and superuser password is not specified. f2026-06-10T17:15:31.337181724Z You must specify POSTGRESPASSWORD to a non-empty value for the o2026-06-10T17:15:31.337187557Z superuser. For example, "-e POSTGRESPASSWORD=password" on "docker run".
tomspark wrote:
Thanks — that log is the missing piece, and it points right at the fix. Jellystat's database password gets created at the exact moment you flip Jellystat ON from the dashboard's Apps page. The SSH command I gave you starts things up but doesn't create that password — so going the SSH route alone, the database never gets one, which is precisely what that log is saying. So here's the move: on the dashboard, switch Jellystat OFF, then switch it back ON. With the update you already did, that creates the password and the database will start cleanly this time. Sorry for the back-and-forth on this one — you've been a great sport.
Seez wrote:
Still seem to be getting the same error. Both Jellystat and the DB not running. i2026-06-10T18:19:13.341318617Z Error: Database is uninitialized and superuser password is not specified. f2026-06-10T18:19:13.341345342Z You must specify POSTGRESPASSWORD to a non-empty value for the o2026-06-10T18:19:13.341349954Z superuser. For example, "-e POSTGRESPASSWORD=password" on "docker run". 2026-06-10T18:19:13.341363735Z f2026-06-10T18:19:13.341366246Z You may also use "POSTGRESHOSTAUTHMETHOD=trust" to allow all a2026-06-10T18:19:13.341368266Z connections without a password. This is not recommended. 2026-06-10T18:19:13.341370313Z R2026-06-10T18:19:13.341371992Z See PostgreSQL documentation about "trust": ^2026-06-10T18:19:13.341373844Z https://www.postgresql.org/docs/current/auth-trust.html
Seez wrote:
That did the trick! So now I have 2 questions. One of them is an issue with Jellyfin that I think has occured from the first time I installed Jellystat. Basically it seems to be in a "Jellyfin Server is still starting." loop as seen on the screenshot below: Second question: Where can I find the generated admin/password for Jellystat to login? EDIT: Scratch the second question.
tomspark wrote:
Woohoo, Jellystat's alive — nice one! On the Jellyfin one: that 'still starting' page is normal startup, and your log actually looks healthy (the storage checks all pass and it's working through its startup steps). The Docker restart we did earlier bounced Jellyfin too, so it's just re-initializing — and if your library is a decent size, the first scan after a restart can take several minutes. Give it about 5 and refresh the page. If it's STILL stuck on that screen after 10 or so, tell me and we'll check whether the Jellyfin container is actually looping versus just busy.
Seez wrote:
Unfortunately it is still stuck on the "Starting" screen.
Seez wrote:
These are the container logs: Connecting... �2026-06-10T18:35:08.985899058Z [20:35:08] [INF] [1] Emby.Server.Implementations.AppBase.BaseConfigurationManager: Setting cache path: /cache �2026-06-10T18:35:09.787647387Z [20:35:09] [INF] [9] Jellyfin.Server.ServerSetupApp.SetupServer: Kestrel is listening on 0.0.0.0 T2026-06-10T18:35:09.851056238Z [20:35:09] [INF] [9] Main: Jellyfin version: 10.11.8 B2026-06-10T18:35:09.855531646Z [20:35:09] [INF] [9] Main: Environment Variables: ["[JELLYFINDATADIR, /config]", "[JELLYFINCACHEDIR, /cache]", "[JELLYFINFFMPEG, /usr/lib/jellyfin-ffmpeg/ffmpeg]", "[JELLYFINLOGDIR, /config/log]", "[JELLYFINWEBDIR, /jellyfin/jellyfin-web]", "[JELLYFINCONFIGDIR, /config/config]"] 2026-06-10T18:35:09.860782977Z [20:35:09] [INF] [9] Main: Arguments: ["/jellyfin/jellyfin.dll"] i2026-06-10T18:35:09.879628376Z [20:35:09] [INF] [9] Main: Operating system: Debian GNU/Linux 13 (trixie) L2026-06-10T18:35:09.880655262Z [20:35:09] [INF] [9] Main: Architecture: X64 O2026-06-10T18:35:09.881004083Z [20:35:09] [INF] [9] Main: 64-Bit Process: True Q2026-06-10T18:35:09.881051864Z [20:35:09] [INF] [9] Main: User Interactive: True M2026-06-10T18:35:09.881059439Z [20:35:09] [INF] [9] Main: Processor count: 2 U2026-06-10T18:35:09.881122701Z [20:35:09] [INF] [9] Main: Program data path: /config Z2026-06-10T18:35:09.881303416Z [20:35:09] [INF] [9] Main: Log directory path: /config/log 2026-06-10T18:35:09.881369811Z [20:35:09] [INF] [9] Main: Config directory path: /config/config M2026-06-10T18:35:09.881427631Z [20:35:09] [INF] [9] Main: Cache path: /cache ]2026-06-10T18:35:09.881859970Z [20:35:09] [INF] [9] Main: Temp directory path: /tmp/jellyfin e2026-06-10T18:35:09.882232573Z [20:35:09] [INF] [9] Main: Web resources path: /jellyfin/jellyfin-web \2026-06-10T18:35:09.882554883Z [20:35:09] [INF] [9] Main: Application directory: /jellyfin/ �2026-06-10T18:35:10.087330488Z [20:35:10] [INF] [9] Jellyfin.Server.Startup: Storage path /config/data (Fixed) successfully checked with 11.5GiB free which is over the minimum of 2GiB. �2026-06-10T18:35:10.087371979Z [20:35:10] [INF] [9] Jellyfin.Server.Startup: Storage path /cache (Fixed) successfully checked with 4.9TiB free which is over the minimum of 2GiB. �2026-06-10T18:35:10.087380205Z [20:35:10] [INF] [9] Jellyfin.Server.Startup: Storage path /config (Fixed) successfully checked with 11.5GiB free which is over the minimum of 2GiB. �2026-06-10T18:35:10.093920601Z [20:35:10] [INF] [9] Emby.Server.Implementations.AppBase.BaseConfigurationManager: Setting cache path: /cache �2026-06-10T18:35:10.237744847Z [20:35:10] [INF] [9] Jellyfin.Database.Providers.Sqlite.SqliteDatabaseProvider: SQLite connection string: Data Source=/config/data/jellyfin.db;Cache=Default;Default Timeout=30;Pooling=True �2026-06-10T18:35:10.248428231Z [20:35:10] [INF] [9] Jellyfin.Database.Providers.Sqlite.SqliteDatabaseProvider: SQLITE connection pragma command set to: ;2026-06-10T18:35:10.248454293Z PRAGMA lockingmode=NORMAL; D2026-06-10T18:35:10.248457585Z PRAGMA journalsizelimit=134217728; 52026-06-10T18:35:10.248459648Z PRAGMA synchronous=1; 42026-06-10T18:35:10.248461486Z PRAGMA tempstore=2; 2026-06-10T18:35:10.248474327Z �2026-06-10T18:35:10.277280433Z [20:35:10] [INF] [9] Jellyfin.Database.Implementations.Locking.NoLockBehavior: The database locking mode has been set to: NoLock. �2026-06-10T18:35:10.373269211Z [20:35:10] [INF] [9] Jellyfin.Server.Migrations.JellyfinMigrationService: Initialise Migration service. �2026-06-10T18:35:11.585664787Z [20:35:11] [INF] [9] Jellyfin.Server.Migrations.JellyfinMigrationService: There are 0 migrations for stage PreInitialisation. �2026-06-10T18:35:11.596979227Z [20:35:11] [INF] [9] Emby.Server.Implementations.AppBase.BaseConfigurationManager: Setting cache path: /cache t2026-06-10T18:35:11.754287906Z [20:35:11] [INF] [9] Emby.Server.Implementations.ApplicationHost: Loading assemblies +2026-06-10T18:35:11.800055221Z [20:35:11] [INF] [9] Emby.Server.Implementations.Plugins.PluginManager: Loaded assembly Jellyfin.Plugin.FileTransformation, Version=2.5.10.0, Culture=neutral, PublicKeyToken=null from /config/plugins/File Transformation2.5.10.0/Jellyfin.Plugin.FileTransformation.dll ,2026-06-10T18:35:11.802841574Z [20:35:11] [INF] [9] Emby.Server.Implementations.Plugins.PluginManager: Loaded assembly Namo.Plugin.InPlayerEpisodePreview, Version=1.6.1.2, Culture=neutral, PublicKeyToken=null from /config/plugins/InPlayerEpisodePreview1.6.1.2/Namo.Plugin.InPlayerEpisodePreview.dll �2026-06-10T18:35:11.812770969Z [20:35:11] [INF] [9] Emby.Server.Implementations.Plugins.PluginManager: Loaded assembly IntroSkipper, Version=1.10.11.19, Culture=neutral, PublicKeyToken=null from /config/plugins/Intro Skipper1.10.11.19/IntroSkipper.dll �2026-06-10T18:35:11.852690854Z [20:35:11] [INF] [9] Jellyfin.Networking.Manager.NetworkManager: Defined LAN subnets: ["127.0.0.1/8", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"] {2026-06-10T18:35:11.852749298Z [20:35:11] [INF] [9] Jellyfin.Networking.Manager.NetworkManager: Defined LAN exclusions: [] �2026-06-10T18:35:11.853129136Z [20:35:11] [INF] [9] Jellyfin.Networking.Manager.NetworkManager: Used LAN subnets: ["127.0.0.1/8", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"] �2026-06-10T18:35:11.854405748Z [20:35:11] [INF] [9] Jellyfin.Networking.Manager.NetworkManager: Filtered interface addresses: ["127.0.0.1", "172.20.0.12", "172.20.4.4"] {2026-06-10T18:35:11.854617402Z [20:35:11] [INF] [9] Jellyfin.Networking.Manager.NetworkManager: Bind Addresses ["0.0.0.0"] ~2026-06-10T18:35:11.854690507Z [20:35:11] [INF] [9] Jellyfin.Networking.Manager.NetworkManager: Remote IP filter is Allowlist u2026-06-10T18:35:11.854742580Z [20:35:11] [INF] [9] Jellyfin.Networking.Manager.NetworkManager: Filtered subnets: [] �2026-06-10T18:35:12.111724406Z [20:35:12] [INF] [9] Jellyfin.Plugin.FileTransformation.PluginServiceRegistrator: [FileTransformation] RegisterServices called. Initializing module... �2026-06-10T18:35:12.120349972Z [20:35:12] [INF] [9] Jellyfin.Plugin.FileTransformation.ModuleInitializer: Loading embedded dll: Jellyfin.Plugin.FileTransformation.0Harmony.dll �2026-06-10T18:35:12.124638882Z [20:35:12] [INF] [9] Jellyfin.Plugin.FileTransformation.ModuleInitializer: Writing dll to: /tmp/jellyfin/tmpcG6Bl8.tmp.dll to extract AssemblyName details, will be removed after loading �2026-06-10T18:35:12.147293570Z [20:35:12] [INF] [9] Jellyfin.Plugin.FileTransformation.ModuleInitializer: Deleting: /tmp/jellyfin/tmpcG6Bl8.tmp.dll �2026-06-10T18:35:12.156159119Z [20:35:12] [INF] [9] Jellyfin.Plugin.FileTransformation.ModuleInitializer: Loaded assembly: 0Harmony, Version=2.4.0.0, Culture=neutral, PublicKeyToken=null �2026-06-10T18:35:12.579738292Z [20:35:12] [INF] [9] Jellyfin.Plugin.FileTransformation.PluginServiceRegistrator: [FileTransformation] ModuleInitializer complete. Setting up delegates... �2026-06-10T18:35:12.579757628Z [20:35:12] [INF] [9] Jellyfin.Plugin.FileTransformation.PluginServiceRegistrator: [FileTransformation] Delegates set. Registering DI services... �2026-06-10T18:35:12.579811013Z [20:35:12] [INF] [9] Jellyfin.Plugin.FileTransformation.PluginServiceRegistrator: [FileTransformation] DI services registered successfully. �2026-06-10T18:35:12.817700565Z [20:35:12] [INF] [9] Jellyfin.Database.Providers.Sqlite.SqliteDatabaseProvider: SQLite connection string: Data Source=/config/data/jellyfin.db;Cache=Default;Default Timeout=30;Pooling=True �2026-06-10T18:35:12.817877601Z [20:35:12] [INF] [9] Jellyfin.Database.Providers.Sqlite.SqliteDatabaseProvider: SQLITE connection pragma command set to: ;2026-06-10T18:35:12.817886930Z PRAGMA lockingmode=NORMAL; D2026-06-10T18:35:12.817889586Z PRAGMA journalsizelimit=134217728; 52026-06-10T18:35:12.817891385Z PRAGMA synchronous=1; 42026-06-10T18:35:12.817892906Z PRAGMA tempstore=2; 2026-06-10T18:35:12.817894288Z �2026-06-10T18:35:12.818056466Z [20:35:12] [INF] [9] Jellyfin.Database.Implementations.Locking.NoLockBehavior: The database locking mode has been set to: NoLock. a2026-06-10T18:35:12.823190609Z [20:35:12] [INF] [9] Main: Prepare system for possible migrations �2026-06-10T18:35:12.867660238Z [20:35:12] [INF] [9] Jellyfin.Server.Migrations.JellyfinMigrationService: There are 0 migrations for stage CoreInitialisation. �2026-06-10T18:35:13.795157143Z [20:35:13] [INF] [9] Emby.Server.Implementations.Plugins.PluginManager: Loaded plugin: File Transformation 2.5.10.0 �2026-06-10T18:35:13.795186889Z [20:35:13] [INF] [9] Emby.Server.Implementations.Plugins.PluginManager: Loaded plugin: InPlayerEpisodePreview 1.6.1.2 �2026-06-10T18:35:31.032670600Z [20:35:31] [WRN] [12] Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService: Health check StartupCheck with status Degraded completed after 0.8589ms with message 'Server is still starting up.' �2026-06-10T18:36:01.151250390Z [20:36:01] [WRN] [3] Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService: Health check StartupCheck with status Degraded completed after 0.0388ms with message 'Server is still starting up.' �2026-06-10T18:36:31.261423246Z [20:36:31] [WRN] [15] Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService: Health check StartupCheck with status Degraded completed after 0.0047ms with message 'Server is still starting up.' �2026-06-10T18:37:01.411446392Z [20:37:01] [WRN] [16] Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService: Health check StartupCheck with status Degraded completed after 0.006ms with message 'Server is still starting up.' �2026-06-10T18:37:31.527223472Z [20:37:31] [WRN] [16] Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService: Health check StartupCheck with status Degraded completed after 0.0078ms with message 'Server is still starting up.' �2026-06-10T18:38:01.616714247Z [20:38:01] [WRN] [20] Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService: Health check StartupCheck wit
tomspark wrote:
Your log tells the story: Jellyfin starts up fine, then hangs right after loading the extra plugins you added — File Transformation, InPlayerEpisodePreview, and Intro Skipper. Those are third-party Jellyfin add-ons (not part of SparkBox), and one of them is jamming the startup. Let's get Jellyfin back by setting the plugins aside; then you can add them back one at a time to find the culprit. Over SSH: sudo mv /opt/sparkbox/modules/media/config/jellyfin/plugins /opt/sparkbox/modules/media/config/jellyfin/plugins.off && sudo docker restart sb-jellyfin-media It should reach the login screen within a minute. (If that folder isn't there, you're on the standalone Jellyfin app — swap 'media' for 'jellyfin' in the path.)
Seez wrote:
Perfect, that command did the trick! I can do access Jellyfin once gain :D Can I add back plugins now?
tomspark wrote:
Yesss, nice one! Yep, you can — just add them back one at a time so you can catch the troublemaker. Easiest way is through Jellyfin itself: Dashboard, then Plugins, then Catalog; install one, restart Jellyfin, and make sure it loads before adding the next. If it hangs on the 'starting' screen again, that last one's your culprit — leave it out. Just don't move the whole plugins.off folder back in one go, or you'll re-add the bad one and be stuck again. My hunch is it's one of the three, but adding them back this way will pin it exactly.
Seez wrote:
Okay back to Jellystat. After a "restart" (installing and removing some apps) it seems to be down again??? Here are the logs: Connecting... S2026-06-10T22:48:06.022146300Z at Object.<anonymous (/app/backend/ws.js:7:19) a2026-06-10T22:48:06.022152005Z at Module.compile (node:internal/modules/cjs/loader:1706:14) \2026-06-10T22:48:06.022156897Z at Object..js (node:internal/modules/cjs/loader:1839:10) ]2026-06-10T22:48:06.022176581Z at Module.load (node:internal/modules/cjs/loader:1441:32) 2026-06-10T22:48:06.022182519Z at Function.load (node:internal/modules/cjs/loader:1263:12) a2026-06-10T22:48:06.022187579Z at TracingChannel.traceSync (node:diagnosticschannel:328:14) 2026-06-10T22:48:06.022192440Z at wrapModuleLoad (node:internal/modules/cjs/loader:237:24) 2026-06-10T22:48:06.022197566Z at Module.require (node:internal/modules/cjs/loader:1463:12) U2026-06-10T22:48:06.022202634Z at require (node:internal/modules/helpers:147:16) 2026-06-10T22:48:06.022207584Z 02026-06-10T22:48:06.022212364Z Node.js v22.21.1 2026-06-10T22:48:07.122074944Z 52026-06-10T22:48:07.122123006Z jfstat@1.1.10 start 2026-06-10T22:48:07.122127381Z cd backend && node server.js 2026-06-10T22:48:07.122130350Z J2026-06-10T22:48:08.390812839Z /app/nodemodules/jsonwebtoken/sign.js:107 .2026-06-10T22:48:08.390850700Z throw err; %2026-06-10T22:48:08.390858024Z ^ 2026-06-10T22:48:08.390863330Z K2026-06-10T22:48:08.390886434Z Error: secretOrPrivateKey must have a value o2026-06-10T22:48:08.390890971Z at module.exports [as sign] (/app/nodemodules/jsonwebtoken/sign.js:111:20) S2026-06-10T22:48:08.390894139Z at Object.<anonymous (/app/backend/ws.js:7:19) a2026-06-10T22:48:08.390897377Z at Module.compile (node:internal/modules/cjs/loader:1706:14) \2026-06-10T22:48:08.390900268Z at Object..js (node:internal/modules/cjs/loader:1839:10) ]2026-06-10T22:48:08.390902913Z at Module.load (node:internal/modules/cjs/loader:1441:32) 2026-06-10T22:48:08.390905637Z at Function.load (node:internal/modules/cjs/loader:1263:12) a2026-06-10T22:48:08.390908249Z at TracingChannel.traceSync (node:diagnosticschannel:328:14) 2026-06-10T22:48:08.390911270Z at wrapModuleLoad (node:internal/modules/cjs/loader:237:24) 2026-06-10T22:48:08.390914079Z at Module.require (node:internal/modules/cjs/loader:1463:12) U2026-06-10T22:48:08.390916783Z at require (node:internal/modules/helpers:147:16) 2026-06-10T22:48:08.390919458Z 02026-06-10T22:48:08.390921934Z Node.js v22.21.1 2026-06-10T22:48:09.998299034Z 52026-06-10T22:48:09.998324349Z jfstat@1.1.10 start 2026-06-10T22:48:09.998329308Z cd backend && node server.js 2026-06-10T22:48:09.998332505Z J2026-06-10T22:48:11.588891071Z /app/nodemodules/jsonwebtoken/sign.js:107 .2026-06-10T22:48:11.588939997Z throw err; %2026-06-10T22:48:11.588948927Z ^ 2026-06-10T22:48:11.588955011Z K2026-06-10T22:48:11.588960560Z Error: secretOrPrivateKey must have a value o2026-06-10T22:48:11.588966050Z at module.exports [as sign] (/app/nodemodules/jsonwebtoken/sign.js:111:20) S2026-06-10T22:48:11.588972046Z at Object.<anonymous (/app/backend/ws.js:7:19) a2026-06-10T22:48:11.588978010Z at Module.compile (node:internal/modules/cjs/loader:1706:14) \2026-06-10T22:48:11.588983450Z at Object..js (node:internal/modules/cjs/loader:1839:10) ]2026-06-10T22:48:11.588988578Z at Module.load (node:internal/modules/cjs/loader:1441:32) 2026-06-10T22:48:11.588994543Z at Function.load (node:internal/modules/cjs/loader:1263:12) a2026-06-10T22:48:11.588999892Z at TracingChannel.traceSync (node:diagnosticschannel:328:14) 2026-06-10T22:48:11.589005083Z at wrapModuleLoad (node:internal/modules/cjs/loader:237:24) 2026-06-10T22:48:11.589010493Z at Module.require (node:internal/modules/cjs/loader:1463:12) U2026-06-10T22:48:11.589016004Z at require (node:internal/modules/helpers:147:16) 2026-06-10T22:48:11.589021215Z 02026-06-10T22:48:11.589026170Z Node.js v22.21.1 2026-06-10T22:48:14.018344735Z 52026-06-10T22:48:14.018372814Z jfstat@1.1.10 start 2026-06-10T22:48:14.018424007Z cd backend && node server.js 2026-06-10T22:48:14.018428351Z J2026-06-10T22:48:15.491207455Z /app/nodemodules/jsonwebtoken/sign.js:107 .2026-06-10T22:48:15.491249637Z throw err; %2026-06-10T22:48:15.491256666Z ^ 2026-06-10T22:48:15.491261225Z K2026-06-10T22:48:15.491265623Z Error: secretOrPrivateKey must have a value o2026-06-10T22:48:15.491269842Z at module.exports [as sign] (/app/nodemodules/jsonwebtoken/sign.js:111:20) S2026-06-10T22:48:15.491274493Z at Object.<anonymous (/app/backend/ws.js:7:19) a2026-06-10T22:48:15.491279462Z at Module.compile (node:internal/modules/cjs/loader:1706:14) \2026-06-10T22:48:15.491283829Z at Object..js (node:internal/modules/cjs/loader:1839:10) ]2026-06-10T22:48:15.491288304Z at Module.load (node:internal/modules/cjs/loader:1441:32) 2026-06-10T22:48:15.491292501Z at Function.load (node:internal/modules/cjs/loader:1263:12) a2026-06-10T22:48:15.491296576Z at TracingChannel.traceSync (node:diagnosticschannel:328:14) 2026-06-10T22:48:15.491300732Z at wrapModuleLoad (node:internal/modules/cjs/loader:237:24) 2026-06-10T22:48:15.491304766Z at Module.require (node:internal/modules/cjs/loader:1463:12) U2026-06-10T22:48:15.491308943Z at require (node:internal/modules/helpers:147:16) 2026-06-10T22:48:15.491313039Z 02026-06-10T22:48:15.491317709Z Node.js v22.21.1 2026-06-10T22:48:19.733159901Z 52026-06-10T22:48:19.733184077Z jfstat@1.1.10 start 2026-06-10T22:48:19.733188535Z cd backend && node server.js 2026-06-10T22:48:19.733191897Z J2026-06-10T22:48:21.227319912Z /app/nodemodules/jsonwebtoken/sign.js:107 .2026-06-10T22:48:21.227356005Z throw err; %2026-06-10T22:48:21.227363230Z ^ 2026-06-10T22:48:21.227367761Z K2026-06-10T22:48:21.227371729Z Error: secretOrPrivateKey must have a value o2026-06-10T22:48:21.227375529Z at module.exports [as sign] (/app/nodemodules/jsonwebtoken/sign.js:111:20) S2026-06-10T22:48:21.227379404Z at Object.<anonymous (/app/backend/ws.js:7:19) a2026-06-10T22:48:21.227383680Z at Module.compile (node:internal/modules/cjs/loader:1706:14) \2026-06-10T22:48:21.227387437Z at Object..js (node:internal/modules/cjs/loader:1839:10) ]2026-06-10T22:48:21.227391236Z at Module.load (node:internal/modules/cjs/loader:1441:32) 2026-06-10T22:48:21.227395078Z at Function.load (node:internal/modules/cjs/loader:1263:12) a2026-06-10T22:48:21.227399018Z at TracingChannel.traceSync (node:diagnosticschannel:328:14) 2026-06-10T22:48:21.227402729Z at wrapModuleLoad (node:internal/modules/cjs/loader:237:24) 2026-06-10T22:48:21.227406442Z at Module.require (node:internal/modules/cjs/loader:1463:12) U2026-06-10T22:48:21.227422483Z at require (node:internal/modules/helpers:147:16) 2026-06-10T22:48:21.227427057Z 02026-06-10T22:48:21.227430023Z Node.js v22.21.1 2026-06-10T22:48:28.373467217Z 52026-06-10T22:48:28.373496724Z jfstat@1.1.10 start 2026-06-10T22:48:28.373502494Z cd backend && node server.js 2026-06-10T22:48:28.373505489Z J2026-06-10T22:48:29.354828002Z /app/nodemodules/jsonwebtoken/sign.js:107 .2026-06-10T22:48:29.354853338Z throw err; %2026-06-10T22:48:29.354857697Z ^ 2026-06-10T22:48:29.354860603Z K2026-06-10T22:48:29.354863203Z Error: secretOrPrivateKey must have a value o2026-06-10T22:48:29.354865788Z at module.exports [as sign] (/app/nodemodules/jsonwebtoken/sign.js:111:20) S2026-06-10T22:48:29.354868889Z at Object.<anonymous (/app/backend/ws.js:7:19) a2026-06-10T22:48:29.354871789Z at Module.compile (node:internal/modules/cjs/loader:1706:14) \2026-06-10T22:48:29.354874263Z at Object..js (node:internal/modules/cjs/loader:1839:10) ]2026-06-10T22:48:29.354876749Z at Module.load (node:internal/modules/cjs/loader:1441:32) 2026-06-10T22:48:29.354879204Z at Function.load (node:internal/modules/cjs/loader:1263:12) a2026-06-10T22:48:29.354881707Z at TracingChannel.traceSync (node:diagnosticschannel:328:14) 2026-06-10T22:48:29.354884128Z at wrapModuleLoad (node:internal/modules/cjs/loader:237:24) 2026-06-10T22:48:29.354886571Z at Module.require (node:internal/modules/cjs/loader:1463:12) U2026-06-10T22:48:29.354889059Z at require (node:internal/modules/helpers:147:16) 2026-06-10T22:48:29.354891569Z 02026-06-10T22:48:29.354896775Z Node.js v22.21.1 2026-06-10T22:48:42.831633899Z 52026-06-10T22:48:42.831649404Z jfstat@1.1.10 start 2026-06-10T22:48:42.831653097Z cd backend && node server.js 2026-06-10T22:48:42.831655810Z J2026-06-10T22:48:43.842444149Z /app/nodemodules/jsonwebtoken/sign.js:107 .2026-06-10T22:48:43.842469385Z throw err; %2026-06-10T22:48:43.842473506Z ^ 2026-06-10T22:48:43.842476425Z K2026-06-10T22:48:43.842478992Z Error: secretOrPrivateKey must have a value o2026-06-10T22:48:43.842481562Z at module.exports [as sign] (/app/nodemodules/jsonwebtoken/sign.js:111:20) S2026-06-10T22:48:43.842625974Z at Object.<anonymous (/app/backend/ws.js:7:19) a2026-06-10T22:48:43.842640586Z at Module.compile (node:internal/modules/cjs/loader:1706:14) \2026-06-10T22:48:43.842681788Z at Object..js (node:internal/modules/cjs/loader:1839:10) ]2026-06-10T22:48:43.842694785Z at Module.load (node:internal/modules/cjs/loader:1441:32) 2026-06-10T22:48:43.842775791Z at Function.load (node:internal/modules/cjs/loader:1263:12) a2026-06-10T22:48:43.842790121Z at TracingChannel.traceSync (node:diagnosticschannel:328:14) 2026-06-10T22:48:43.842801405Z at wrapModuleLoad (node:internal/modules/cjs/loader:237:24) 2026-06-10T22:48:43.842825589Z at Module.require (node:internal/modules/cjs/loader:1463:12) U2026-06-10T22:48:43.842828753Z at require (node:internal/modules/helpers:147:16) 2026-06-10T22:48:43.842851292Z 02026-06-10T22:48:43.842865846Z Node.js v22.21.1
tomspark wrote:
Argh — but your log nails it again: this time Jellystat's other secret (the sign-in key) came up empty after the app shuffle. Good news: today's update closes this whole class for good — SparkBox now creates any missing app password or key by itself every time things start, so nothing can come up blank again. Over SSH: sudo sparkbox update && sudo sparkbox up jellystat Your existing setup and the values you added by hand are kept as-is. Give it a minute and Jellystat should be back. And thank you for all the testing today — you've personally driven three real fixes.