[GH-ISSUE #54] Bug: User profile is not persisted across container restarts #17

Closed
opened 2026-10-15 12:54:42 +00:00 by bsakaguchi · 3 comments
Owner

Originally created by @shitfacevk on GitHub (Jun 10, 2026).
Original GitHub issue: https://github.com/games-on-whales/unraid-plugin/issues/54

Bug: User profile is not persisted across container restarts

Description

Every time the Docker container is restarted, the user profile is reset to its default state. It appears that the profile data is stored inside the container rather than being mounted to a persistent location on the host. Any customization (settings, game library, saved configurations, etc.) is lost on every restart.

Steps to Reproduce

  1. Install the plugin and start the container
  2. Configure a user profile (e.g. set up Sunshine/Steam, adjust settings)
  3. Restart the Docker container (either manually or after an Unraid reboot)
  4. Observe that the profile has been reset to defaults

Expected Behavior

User profile and configuration data should persist across container restarts via a mounted host directory.

Actual Behavior

Profile data is lost on every container restart, regardless of appdata path or network mode used.

Tested Configurations

Setting Tested values Result
Appdata path /mnt/cache/gow, default path Profile lost on restart
Network mode Host, bridge (and others) Profile lost on restart

Environment

  • Unraid version: 7.3.1
  • Nvidia driver: 595.80
  • Plugin version: 2026.06.08

Additional Context

Since the issue persists across different appdata paths and network configurations, it seems like the plugin is not correctly mounting the appdata directory into the container for persistent storage - rather than this being a path or permissions issue.

Originally created by @shitfacevk on GitHub (Jun 10, 2026). Original GitHub issue: https://github.com/games-on-whales/unraid-plugin/issues/54 ## Bug: User profile is not persisted across container restarts ### Description Every time the Docker container is restarted, the user profile is reset to its default state. It appears that the profile data is stored inside the container rather than being mounted to a persistent location on the host. Any customization (settings, game library, saved configurations, etc.) is lost on every restart. ### Steps to Reproduce 1. Install the plugin and start the container 2. Configure a user profile (e.g. set up Sunshine/Steam, adjust settings) 3. Restart the Docker container (either manually or after an Unraid reboot) 4. Observe that the profile has been reset to defaults ### Expected Behavior User profile and configuration data should persist across container restarts via a mounted host directory. ### Actual Behavior Profile data is lost on every container restart, regardless of appdata path or network mode used. ### Tested Configurations | Setting | Tested values | Result | |---|---|---| | Appdata path | `/mnt/cache/gow`, default path | Profile lost on restart | | Network mode | Host, bridge (and others) | Profile lost on restart | ### Environment - Unraid version: 7.3.1 - Nvidia driver: 595.80 - Plugin version: 2026.06.08 ### Additional Context Since the issue persists across different appdata paths and network configurations, it seems like the plugin is not correctly mounting the appdata directory into the container for persistent storage - rather than this being a path or permissions issue.
Author
Owner

@JBailes commented on GitHub (Jun 14, 2026):

Thanks for the detailed write-up. I've traced the persistence path end to end and the plugin is mounting everything where Wolf expects it (config.toml + pairing under <appdata>/cfg, per-app state under <appdata>/profile_data/...), so I want to pin down exactly which layer is resetting before I change anything.

Could you grab a few things from a server that shows the problem? Replace /mnt/user/appdata/gow with your actual appdata path if you changed it.

  1. Do you have to re-pair Moonlight after a restart, or does it stay paired but the in-app stuff is gone?

  2. Host vs in-container view of the app state:

docker exec wolf ls -la /etc/wolf/profile_data
ls -la /mnt/user/appdata/gow/profile_data
  1. Is the config actually landing on disk and keeping your paired clients?
ls -la /mnt/user/appdata/gow/cfg
docker exec wolf head -40 /etc/wolf/cfg/config.toml
  1. The first ~50 lines of the Wolf log right after a restart:
docker logs wolf 2>&1 | head -50

What I'm trying to confirm: whether the data is being written into the host appdata folder (persists) or into Wolf's own container layer (wiped on restart). The two ls outputs in step 2 should match — if the host one is empty but the in-container one isn't, that tells me exactly what to fix.

Anyone else hitting this, feel free to paste the same. Appreciate the help narrowing it down.

<!-- gh-comment-id:4702353178 --> @JBailes commented on GitHub (Jun 14, 2026): Thanks for the detailed write-up. I've traced the persistence path end to end and the plugin is mounting everything where Wolf expects it (`config.toml` + pairing under `<appdata>/cfg`, per-app state under `<appdata>/profile_data/...`), so I want to pin down exactly which layer is resetting before I change anything. Could you grab a few things from a server that shows the problem? Replace `/mnt/user/appdata/gow` with your actual appdata path if you changed it. 1. Do you have to **re-pair Moonlight** after a restart, or does it stay paired but the in-app stuff is gone? 2. Host vs in-container view of the app state: ```bash docker exec wolf ls -la /etc/wolf/profile_data ls -la /mnt/user/appdata/gow/profile_data ``` 3. Is the config actually landing on disk and keeping your paired clients? ```bash ls -la /mnt/user/appdata/gow/cfg docker exec wolf head -40 /etc/wolf/cfg/config.toml ``` 4. The first ~50 lines of the Wolf log right after a restart: ```bash docker logs wolf 2>&1 | head -50 ``` What I'm trying to confirm: whether the data is being written into the host appdata folder (persists) or into Wolf's own container layer (wiped on restart). The two `ls` outputs in step 2 should match — if the host one is empty but the in-container one isn't, that tells me exactly what to fix. Anyone else hitting this, feel free to paste the same. Appreciate the help narrowing it down.
Author
Owner

@shitfacevk commented on GitHub (Jun 14, 2026):

  1. Yes, i have to re-pair moonlight, everything is resetted.

root@kapten:~# docker exec wolf ls -la /etc/wolf/profile_data

ls: cannot access '/etc/wolf/profile_data': No such file or directory

root@kapten:~# ls -la /mnt/cache/gow/

total 20
drwxrwxrwx 1 nobody users 120 Jun 10 17:57 ./
drwxrwxrwx 1 nobody users 72 Jun 14 04:40 ../
drwxr-xr-x 1 root root 0 Jun 10 17:57 cfg/
drwxrwxr-x 1 viktor 1000 28 Jun 10 17:59 compatibilitytools.d/
drwxrwxr-x 1 viktor 1000 0 Jun 10 17:57 covers/
-rw-r--r-- 1 root root 1484 Jun 10 18:33 docker-compose.yml
drwxr-xr-x 1 root root 0 Jun 10 17:57 steam/
drwxrwxr-x 1 viktor 1000 16 Jun 10 17:59 wolf-den/

root@kapten:~# ls -la /mnt/cache/gow/cfg/

total 0
drwxr-xr-x 1 root root 0 Jun 10 17:57 ./
drwxrwxrwx 1 nobody users 120 Jun 10 17:57 ../

root@kapten:~# docker exec wolf head -40 /etc/wolf/cfg/config.toml

head: cannot open '/etc/wolf/cfg/config.toml' for reading: No such file or directory

root@kapten:~# docker logs wolf 2>&1 | head -50

[2026-06-14 19:14:12]
[2026-06-14 19:14:12] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
[2026-06-14 19:14:12] **** Configure default user ****
[2026-06-14 19:14:12] Container running as root. Nothing to do.
[2026-06-14 19:14:12] DONE
[2026-06-14 19:14:12]
[2026-06-14 19:14:12] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
[2026-06-14 19:14:12] **** Configure devices ****
[2026-06-14 19:14:12] Exec device groups
[2026-06-14 19:14:13] Adding user 'root' to groups: gow-gid-71,root
[2026-06-14 19:14:13] DONE
[2026-06-14 19:14:13]
[2026-06-14 19:14:13] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
[2026-06-14 19:14:13] Nvidia driver volume detected
[2026-06-14 19:14:13] [nvidia] Add Vulkan ICD
[2026-06-14 19:14:13] [nvidia] Add EGL external platform
[2026-06-14 19:14:13] [nvidia] Add egl-vendor
[2026-06-14 19:14:13] [nvidia] Add gbm backend
[2026-06-14 19:14:13]
[2026-06-14 19:14:13] [ /etc/cont-init.d/init-gamescope.sh: executing... ]
[2026-06-14 19:14:13] Launching the container's startup script as user 'root'
2026-06-14 19:14:13,465 INFO Set uid to user 0 succeeded
2026-06-14 19:14:13,468 INFO RPC interface 'supervisor' initialized
2026-06-14 19:14:13,468 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2026-06-14 19:14:13,468 INFO supervisord started with pid 1
2026-06-14 19:14:14,470 INFO spawned: 'pulseaudio' with pid 130
2026-06-14 19:14:14,473 INFO spawned: 'wolf' with pid 131
[wolf] waiting for PulseAudio socket /tmp/sockets/pulse-socket
0:00:00.043604061 134 0x5619b2ea5f20 WARN default ges-meta-container.c:238:_set_value:GESAsset@0x5619b2ea57f0 Could not set value on item: format-version
0:00:00.043622034 134 0x5619b2ea5f20 WARN default ges-meta-container.c:238:_set_value:GESAsset@0x5619b2ea6160 Could not set value on item: format-version
0:00:00.043629950 134 0x5619b2ea5f20 WARN default ges-meta-container.c:238:_set_value:GESAsset@0x5619b2ea69d0 Could not set value on item: format-version
0:00:00.043881003 134 0x5619b2ea5f20 WARN structure gststructure.c:3378:priv_gst_structure_parse_fields: Failed to find delimiter, r=mimetype
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
0:00:00.100391063 134 0x5619b2ea5f20 WARN default gstmsdkcaps.c:1284:gst_msdkcaps_dec_create_caps: Failed to create caps for VP8 DEC
0:00:00.100397857 134 0x5619b2ea5f20 WARN default gstmsdk.c:250:_register_decoders: Failed to create caps for VP8 DEC
0:00:00.100641363 134 0x5619b2ea5f20 WARN default gstmsdkcaps.c:1045:_dec_get_codec_index: Unsupported codec VVC
0:00:00.100645355 134 0x5619b2ea5f20 WARN default gstmsdkcaps.c:1284:gst_msdkcaps_dec_create_caps: Failed to create caps for VVC DEC
0:00:00.100647559 134 0x5619b2ea5f20 WARN default gstmsdk.c:250:_register_decoders: Failed to create caps for VVC DEC
0:00:00.104266394 134 0x5619b2ea5f20 WARN default gstmsdkallocator_libva.c:820:gst_msdk_get_supported_modifiers: Failed to get modifier RGB16:0x00ffffffffffffff
0:00:00.222961180 134 0x5619b2ea5f20 WARN cudanvrtc gstcudanvrtc.cpp:179:gst_cuda_nvrtc_load_library_once: Failed to load 'nvrtcGetCUBINSize', 'nvrtcGetCUBINSize': /usr/local/nvidia/lib/libnvrtc.so: undefined symbol: nvrtcGetCUBINSize
0:00:00.645617908 134 0x5619b2ea5f20 WARN nvav1encoder gstnvav1encoder.cpp:1429:gst_nv_av1_encoder_create_class_data: New preset is not supported
0:00:00.705743833 134 0x5619b2ea5f20 WARN vadisplay gstvadisplay.c:401:gst_va_display_initialize: vaInitialize: unknown libva error
libva info: VA-API version 1.22.0

I think i solved the problem.
I edited the docker-compose.yml

services:
  wolf:
    image: ghcr.io/games-on-whales/wolf:stable
    container_name: wolf
    environment:
      - WOLF_RENDER_NODE=/dev/dri/renderD129
      - NVIDIA_DRIVER_VOLUME_NAME=nvidia-driver-vol
      - XDG_RUNTIME_DIR=/tmp/sockets
#    - WOLF_CFG_FILE=/etc/wolf/cfg/config.toml <--- Wrong       
      - WOLF_CFG_FILE=/mnt/cache/gow/cfg/config.toml <-- Right
      - WOLF_DOCKER_SOCKET=/var/run/docker.sock
      - HOST_APPS_STATE_FOLDER=/mnt/cache/gow
    volumes:
#    - /mnt/cache/gow:/etc/wolf:rw  <---- Wrong
      - /mnt/cache/gow:/mnt/cache/gow:rw <--- Right, same path on both sides.
      - /var/run/docker.sock:/var/run/docker.sock:rw
      - /dev/:/dev/:rw
      - /run/udev:/run/udev:rw
      - nvidia-driver-vol:/usr/nvidia:rw
      - wolf-socket:/tmp/sockets
<!-- gh-comment-id:4702687967 --> @shitfacevk commented on GitHub (Jun 14, 2026): 1. Yes, i have to re-pair moonlight, everything is resetted. 2. `root@kapten:~# docker exec wolf ls -la /etc/wolf/profile_data` > ls: cannot access '/etc/wolf/profile_data': No such file or directory `root@kapten:~# ls -la /mnt/cache/gow/` > total 20 > drwxrwxrwx 1 nobody users 120 Jun 10 17:57 ./ > drwxrwxrwx 1 nobody users 72 Jun 14 04:40 ../ > drwxr-xr-x 1 root root 0 Jun 10 17:57 cfg/ > drwxrwxr-x 1 viktor 1000 28 Jun 10 17:59 compatibilitytools.d/ > drwxrwxr-x 1 viktor 1000 0 Jun 10 17:57 covers/ > -rw-r--r-- 1 root root 1484 Jun 10 18:33 docker-compose.yml > drwxr-xr-x 1 root root 0 Jun 10 17:57 steam/ > drwxrwxr-x 1 viktor 1000 16 Jun 10 17:59 wolf-den/ 3. `root@kapten:~# ls -la /mnt/cache/gow/cfg/` > total 0 > drwxr-xr-x 1 root root 0 Jun 10 17:57 ./ > drwxrwxrwx 1 nobody users 120 Jun 10 17:57 ../ `root@kapten:~# docker exec wolf head -40 /etc/wolf/cfg/config.toml` > head: cannot open '/etc/wolf/cfg/config.toml' for reading: No such file or directory 4. `root@kapten:~# docker logs wolf 2>&1 | head -50` > [2026-06-14 19:14:12] > [2026-06-14 19:14:12] [ /etc/cont-init.d/10-setup_user.sh: executing... ] > [2026-06-14 19:14:12] **** Configure default user **** > [2026-06-14 19:14:12] Container running as root. Nothing to do. > [2026-06-14 19:14:12] DONE > [2026-06-14 19:14:12] > [2026-06-14 19:14:12] [ /etc/cont-init.d/15-setup_devices.sh: executing... ] > [2026-06-14 19:14:12] **** Configure devices **** > [2026-06-14 19:14:12] Exec device groups > [2026-06-14 19:14:13] Adding user 'root' to groups: gow-gid-71,root > [2026-06-14 19:14:13] DONE > [2026-06-14 19:14:13] > [2026-06-14 19:14:13] [ /etc/cont-init.d/30-nvidia.sh: executing... ] > [2026-06-14 19:14:13] Nvidia driver volume detected > [2026-06-14 19:14:13] [nvidia] Add Vulkan ICD > [2026-06-14 19:14:13] [nvidia] Add EGL external platform > [2026-06-14 19:14:13] [nvidia] Add egl-vendor > [2026-06-14 19:14:13] [nvidia] Add gbm backend > [2026-06-14 19:14:13] > [2026-06-14 19:14:13] [ /etc/cont-init.d/init-gamescope.sh: executing... ] > [2026-06-14 19:14:13] Launching the container's startup script as user 'root' > 2026-06-14 19:14:13,465 INFO Set uid to user 0 succeeded > 2026-06-14 19:14:13,468 INFO RPC interface 'supervisor' initialized > 2026-06-14 19:14:13,468 CRIT Server 'unix_http_server' running without any HTTP authentication checking > 2026-06-14 19:14:13,468 INFO supervisord started with pid 1 > 2026-06-14 19:14:14,470 INFO spawned: 'pulseaudio' with pid 130 > 2026-06-14 19:14:14,473 INFO spawned: 'wolf' with pid 131 > [wolf] waiting for PulseAudio socket /tmp/sockets/pulse-socket > 0:00:00.043604061 134 0x5619b2ea5f20 WARN default ges-meta-container.c:238:_set_value:<GESAsset@0x5619b2ea57f0> Could not set value on item: format-version > 0:00:00.043622034 134 0x5619b2ea5f20 WARN default ges-meta-container.c:238:_set_value:<GESAsset@0x5619b2ea6160> Could not set value on item: format-version > 0:00:00.043629950 134 0x5619b2ea5f20 WARN default ges-meta-container.c:238:_set_value:<GESAsset@0x5619b2ea69d0> Could not set value on item: format-version > 0:00:00.043881003 134 0x5619b2ea5f20 WARN structure gststructure.c:3378:priv_gst_structure_parse_fields: Failed to find delimiter, r=mimetype > libva info: VA-API version 1.22.0 > libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so > libva info: Found init function __vaDriverInit_1_22 > libva info: va_openDriver() returns 0 > libva info: VA-API version 1.22.0 > libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so > libva info: Found init function __vaDriverInit_1_22 > libva info: va_openDriver() returns 0 > 0:00:00.100391063 134 0x5619b2ea5f20 WARN default gstmsdkcaps.c:1284:gst_msdkcaps_dec_create_caps: Failed to create caps for VP8 DEC > 0:00:00.100397857 134 0x5619b2ea5f20 WARN default gstmsdk.c:250:_register_decoders: Failed to create caps for VP8 DEC > 0:00:00.100641363 134 0x5619b2ea5f20 WARN default gstmsdkcaps.c:1045:_dec_get_codec_index: Unsupported codec VVC > 0:00:00.100645355 134 0x5619b2ea5f20 WARN default gstmsdkcaps.c:1284:gst_msdkcaps_dec_create_caps: Failed to create caps for VVC DEC > 0:00:00.100647559 134 0x5619b2ea5f20 WARN default gstmsdk.c:250:_register_decoders: Failed to create caps for VVC DEC > 0:00:00.104266394 134 0x5619b2ea5f20 WARN default gstmsdkallocator_libva.c:820:gst_msdk_get_supported_modifiers: Failed to get modifier RGB16:0x00ffffffffffffff > 0:00:00.222961180 134 0x5619b2ea5f20 WARN cudanvrtc gstcudanvrtc.cpp:179:gst_cuda_nvrtc_load_library_once: Failed to load 'nvrtcGetCUBINSize', 'nvrtcGetCUBINSize': /usr/local/nvidia/lib/libnvrtc.so: undefined symbol: nvrtcGetCUBINSize > 0:00:00.645617908 134 0x5619b2ea5f20 WARN nvav1encoder gstnvav1encoder.cpp:1429:gst_nv_av1_encoder_create_class_data:<cudacontext0> New preset is not supported > 0:00:00.705743833 134 0x5619b2ea5f20 WARN vadisplay gstvadisplay.c:401:gst_va_display_initialize:<vadisplaydrm2> vaInitialize: unknown libva error > libva info: VA-API version 1.22.0 I think i solved the problem. I edited the docker-compose.yml ``` services: wolf: image: ghcr.io/games-on-whales/wolf:stable container_name: wolf environment: - WOLF_RENDER_NODE=/dev/dri/renderD129 - NVIDIA_DRIVER_VOLUME_NAME=nvidia-driver-vol - XDG_RUNTIME_DIR=/tmp/sockets # - WOLF_CFG_FILE=/etc/wolf/cfg/config.toml <--- Wrong - WOLF_CFG_FILE=/mnt/cache/gow/cfg/config.toml <-- Right - WOLF_DOCKER_SOCKET=/var/run/docker.sock - HOST_APPS_STATE_FOLDER=/mnt/cache/gow volumes: # - /mnt/cache/gow:/etc/wolf:rw <---- Wrong - /mnt/cache/gow:/mnt/cache/gow:rw <--- Right, same path on both sides. - /var/run/docker.sock:/var/run/docker.sock:rw - /dev/:/dev/:rw - /run/udev:/run/udev:rw - nvidia-driver-vol:/usr/nvidia:rw - wolf-socket:/tmp/sockets ```
Author
Owner

@JBailes commented on GitHub (Jun 14, 2026):

Thanks for digging in, your edit pinned it exactly. The cause is that Wolf's startup.sh re-derives its config path from HOST_APPS_STATE_FOLDER, so with appdata mounted at /etc/wolf it was writing config and pairing to a path that wasn't actually mounted, which is why it reset every restart. Mounting appdata at the same path inside the container as on the host (the identity mount you found) is the fix.

Just pushed it to main (#56); it'll ship in the next release. Once you update the plugin and redeploy, config and pairing should stick across restarts with no need to hand-edit the compose. Shout if it still misbehaves.

<!-- gh-comment-id:4702743762 --> @JBailes commented on GitHub (Jun 14, 2026): Thanks for digging in, your edit pinned it exactly. The cause is that Wolf's `startup.sh` re-derives its config path from `HOST_APPS_STATE_FOLDER`, so with appdata mounted at `/etc/wolf` it was writing config and pairing to a path that wasn't actually mounted, which is why it reset every restart. Mounting appdata at the same path inside the container as on the host (the identity mount you found) is the fix. Just pushed it to `main` (#56); it'll ship in the next release. Once you update the plugin and redeploy, config and pairing should stick across restarts with no need to hand-edit the compose. Shout if it still misbehaves.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
games-on-whales/unraid-plugin#17
No description provided.