Deleted network mount not unmounting

I made a network drive the location for my nodes backups, but then deleted that and located it somewhere else. But now in my logs the Umbrel keeps on trying to connect to that location long after I’ve deleted it. There’s no mention of these deleted Network location in the GUI, but this is the message that appears ever minute

Aug 03 17:47:21 umbrel umbreld[1198]: [files:networkstorage ] Mounting network share: /Network/MyPC.local/Backups (Umbrel)
Aug 03 17:47:21 umbrel kernel: CIFS: enabling forceuid mount option implicitly because uid= option is specified
Aug 03 17:47:21 umbrel kernel: CIFS: enabling forcegid mount option implicitly because gid= option is specified
Aug 03 17:47:21 umbrel kernel: CIFS: Attempting to mount //MyPC.local/Backups (Umbrel)
Aug 03 17:47:21 umbrel kernel: CIFS: VFS: Error connecting to socket. Aborting operation.
Aug 03 17:47:21 umbrel kernel: CIFS: VFS: cifs_mount failed w/return code = -111
Aug 03 17:47:21 umbrel umbreld[1198]: [files:networkstorage ] [error] Failed to mount network share: /Network/MyPC.local/Backups (Umbrel), cleaning up mount directory
Aug 03 17:47:21 umbrel umbreld[1198]: [files:networkstorage ] Unmounting network share: /Network/MyPC.local/Backups (Umbrel)
Aug 03 17:47:21 umbrel umbreld[1198]: [files:networkstorage ] Successfully unmounted network share: /Network/MyPC.local/Backups (Umbrel)

What would be helpful is if I were pointed into the direction of where this is configured so I can manually delete it as it clearly wasn’t deleted properly when I did it in the GUI.

Could you go to Settings > Backups > Configure and check if the old backup location is still listed there? If it is, click it and select Disconnect. That should remove it permanently and stop the connection attempts.

So when I first noticed this problem, I had two locations it was trying to mount. One for the current backup (that was working) and another for and old backup that I deleted a few weeks ago. So I totally removed the current one and that stopped that error from repeating, So I’m aware of the location of where to delete network backups and mounting. But the above one was already deleted from that location you pointed to. Yet the thing still remains. So I’m just wondering where the settings are for these things so I can turn it off.

I also noticed this also that keeps on repeating. How do I identify these ‘umbrelid’ numbers so I can work out what container is causing the problem

Aug 07 16:30:24 umbrel umbreld[948]: JsonWebTokenError: jwt must be provided
Aug 07 16:30:24 umbrel umbreld[948]: at module.exports [as verify] (/opt/umbreld/node_modules/jsonwebtoken/verify.js:60:17)
Aug 07 16:30:24 umbrel umbreld[948]: at Module.verify (file:///opt/umbreld/source/modules/jwt.ts:1:759)
Aug 07 16:30:24 umbrel umbreld[948]: at Server.verifyToken (file:///opt/umbreld/source/modules/server/index.ts:1:1927)
Aug 07 16:30:24 umbrel umbreld[948]: at async Server. (file:///opt/umbreld/source/modules/server/index.ts:1:3183)

How do I stop this constant repeat error?

Ah got it. Sounds like the old network share may still be stuck in umbrelOS’s saved config even though it no longer shows in the UI.

If you wanna upload the umbrelOS logs from Settings > System > Troubleshoot > umbrelOS, I’ll be happy to take a look at it.

The numbers like jwt.ts:1:759 aren’t Umbrel IDs or container IDs. They’re just line and column references in umbreld’s code, so that error isn’t pointing to a specific app container.

Here is my logs for the previous few hours. Also, how do I delete the logs? As when I downloaded it, the logs itself was in the GB range. Not sure how to find them and delete them, as I think the OS has chanced since 1.7.something. I’m on Raspberry Pi 4 8GB

umbrel-1786126791695.log (1.6 MB)

I had a look through the logs. The old share is definitely still saved in umbrelOS even though it’s gone from the UI. It’s loading both the working Mac-mini share and the old umbrel-pc backup share after every reboot, then retrying the old one every minute.

You can remove just the old entry from Settings > Advanced > Terminal > umbrelOS with:

umbreld client files.removeNetworkShare.mutate --mountPath '/Network/umbrel-pc.local/Backups (Umbrel)'

Then check that it’s gone with:

umbreld client files.listNetworkShares.query

That won’t touch the working Mac-mini share.

The JWT errors are failed WebSocket connections rather than an app container. They’re usually caused by an old Umbrel browser tab or session trying to reconnect without a login token. I’d close any open Umbrel tabs on your devices, clear the site data for umbrel.local or the IP address you use, then sign back in.

The system journal is currently around 2.7 GB and capped at 4 GB, so it will rotate automatically. Downloading it doesn’t create another copy on your Umbrel. If you still want to trim the older logs now, you can run:

sudo journalctl --rotate --vacuum-size=500M

The Umbrel team previously confirmed that those Files watcher messages are harmless and said they should be fixed in the next umbrelOS release, so I wouldn’t worry about them.

Thank you very much for that. It worked. But how do I do that on a Mini-PC version. The above works on a raspberry pi 4, not on a mini intel pc.

Also, it seems like the internal structure of Umbrel on RPi4 and mini PC’s are different. On a mini-PC I can put startup scripts in ~/umbrel/custom-hooks/pre-start, but that doesn’t work on a RPi4.

Glad that fixed it. The umbreld command should be the same on Intel and Raspberry Pi, since it isn’t architecture-specific. Could you paste the exact error you get on the mini PC, along with the output from:

command -v umbreld
umbreld client system.version.query
umbreld client files.listNetworkShares.query

That should show whether the mini PC is running an older/different type of install or if it’s just a PATH issue.

For the pre-start hook, I checked your Pi logs. It’s running umbrelOS 1.7.4 and the umbrel-custom-pre-start service is starting, but it isn’t finding or running a hook file. Use the full path rather than ~/umbrel, since ~ can point somewhere different depending on how the terminal was opened:

sudo ls -l /home/umbrel/umbrel/custom-hooks/pre-start
sudo journalctl -u umbrel-custom-pre-start.service -b --no-pager

If the file exists, make sure it’s executable:

sudo chmod +x /home/umbrel/umbrel/custom-hooks/pre-start
sudo reboot

The correct hook path on both systems running umbrelOS 1.7.2 or newer is /home/umbrel/umbrel/custom-hooks/pre-start.

I’m getting the following error message:

umbreld client files.removeNetworkShare.mutate --mountPath ‘/Network/umbrel-pi.local/Backups (Umbrel)’
/opt/umbreld/node_modules/buffer-equal-constant-time/index.js:37
var origSlowBufEqual = SlowBuffer.prototype.equal;
^

TypeError: Cannot read properties of undefined (reading ‘prototype’)
at Object. (/opt/umbreld/node_modules/buffer-equal-constant-time/index.js:37:35)
at Module._compile (node:internal/modules/cjs/loader:1829:14)
at Object.S (/opt/umbreld/node_modules/tsx/dist/cjs/index.cjs:1:1292)
at Module.load (node:internal/modules/cjs/loader:1552:32)
at Module._load (node:internal/modules/cjs/loader:1354:12)
at wrapModuleLoad (node:internal/modules/cjs/loader:255:19)
at Module.require (node:internal/modules/cjs/loader:1575:12)
at require (node:internal/modules/helpers:191:16)
at Object. (/opt/umbreld/node_modules/jwa/index.js:1:19)
at Module._compile (node:internal/modules/cjs/loader:1829:14)

Node.js v26.0.0

The commands you gave above:

command -v umbreld
/usr/local/bin/umbreld

Then:

umbreld client system.version.query
/opt/umbreld/node_modules/buffer-equal-constant-time/index.js:37
var origSlowBufEqual = SlowBuffer.prototype.equal;
^

TypeError: Cannot read properties of undefined (reading ‘prototype’)
at Object. (/opt/umbreld/node_modules/buffer-equal-constant-time/index.js:37:35)
at Module._compile (node:internal/modules/cjs/loader:1829:14)
at Object.S (/opt/umbreld/node_modules/tsx/dist/cjs/index.cjs:1:1292)
at Module.load (node:internal/modules/cjs/loader:1552:32)
at Module._load (node:internal/modules/cjs/loader:1354:12)
at wrapModuleLoad (node:internal/modules/cjs/loader:255:19)
at Module.require (node:internal/modules/cjs/loader:1575:12)
at require (node:internal/modules/helpers:191:16)
at Object. (/opt/umbreld/node_modules/jwa/index.js:1:19)
at Module._compile (node:internal/modules/cjs/loader:1829:14)

Node.js v26.0.0

Then:

umbreld client files.listNetworkShares.query
/opt/umbreld/node_modules/buffer-equal-constant-time/index.js:37
var origSlowBufEqual = SlowBuffer.prototype.equal;
^

TypeError: Cannot read properties of undefined (reading ‘prototype’)
at Object. (/opt/umbreld/node_modules/buffer-equal-constant-time/index.js:37:35)
at Module._compile (node:internal/modules/cjs/loader:1829:14)
at Object.S (/opt/umbreld/node_modules/tsx/dist/cjs/index.cjs:1:1292)
at Module.load (node:internal/modules/cjs/loader:1552:32)
at Module._load (node:internal/modules/cjs/loader:1354:12)
at wrapModuleLoad (node:internal/modules/cjs/loader:255:19)
at Module.require (node:internal/modules/cjs/loader:1575:12)
at require (node:internal/modules/helpers:191:16)
at Object. (/opt/umbreld/node_modules/jwa/index.js:1:19)
at Module._compile (node:internal/modules/cjs/loader:1829:14)

Node.js v26.0.0

I suspect the issue is that I changed my node.js to v26 so that I could run BalanceOfSatoshi.

So I did:

nvm use 22.22.2

And then I got the following:

umbreld client system.version.query
{
“version”: “1.7.4”,
“name”: “umbrelOS 1.7.4”,
“previousVersion”: “1.7.3”
}

And

umbreld client files.listNetworkShares.query
[
{
“host”: “umbrel-pi.local”,
“share”: “Backups (Umbrel)”,
“mountPath”: “/Network/umbrel-pi.local/Backups (Umbrel)”,
“isMounted”: false
},
{
“host”: “Mac-mini.local”,
“share”: “LN-Umbrel”,
“mountPath”: “/Network/MyPC.local/LN-Umbrel”,
“isMounted”: true
}
]

So it was the Node.js version that was the issue.

Regarding the hooks, then this is the response to your commands:

sudo ls -l /home/umbrel/umbrel/custom-hooks/pre-start
sudo journalctl -u umbrel-custom-pre-start.service -b --no-pager

-rwxr-xr-x 1 root root 1148 Aug 7 16:19 /home/umbrel/umbrel/custom-hooks/pre-start
Aug 07 17:59:02 umbrel systemd[1]: Starting umbrel-custom-pre-start.service - Run Umbrel custom pre-start hook…
Aug 07 17:59:02 umbrel systemd[1]: umbrel-custom-pre-start.service: Deactivated successfully.
Aug 07 17:59:02 umbrel systemd[1]: Finished umbrel-custom-pre-start.service - Run Umbrel custom pre-start hook.

The path is right, but it doesnt seem to be working. The permissions were fine.

Yep, Node 26 was the mini-PC issue, not a difference between Intel and Pi. Use Node 22 whenever you run the Umbrel CLI, then remove the old share:

nvm use 22.22.2
umbreld client files.removeNetworkShare.mutate --mountPath '/Network/umbrel-pi.local/Backups (Umbrel)'
umbreld client files.listNetworkShares.query

For the hook, systemd doesn’t load your normal NVM setup. If the hook needs Balance of Satoshis, replace the existing BoS line with this, adding your usual arguments:

sudo -u umbrel -H bash -lc 'export NVM_DIR="$HOME/.nvm"; . "$NVM_DIR/nvm.sh"; nvm use 26 >/dev/null; bos <your arguments>'

Then test the hook directly:

HOOK="/home/umbrel/umbrel/custom-hooks/pre-start"
sudo bash -n "$HOOK" && sudo chmod 755 "$HOOK"
sudo systemctl restart umbrel-custom-pre-start.service
sudo journalctl -u umbrel-custom-pre-start.service -b -n 100 --no-pager

If the log says it completed successfully, reboot and it should run normally. If it fails, the same log should show which command inside the hook caused it.

The result to this is:

Aug 11 19:16:24 umbrel systemd[1]: Starting umbrel-custom-pre-start.service - Run Umbrel custom pre-start hook…
Aug 11 19:16:25 umbrel run-pre-start[17342]: umbrel custom pre-start hook: running ‘/home/umbrel/umbrel/custom-hooks/pre-start’
Aug 11 19:16:25 umbrel run-pre-start[17342]: umbrel custom pre-start hook: completed successfully
Aug 11 19:16:25 umbrel systemd[1]: umbrel-custom-pre-start.service: Deactivated successfully.
Aug 11 19:16:25 umbrel systemd[1]: Finished umbrel-custom-pre-start.service - Run Umbrel custom pre-start hook.

But it doesn’t execute.

if I simply do

. umbrel/custom-hooks/pre-start

It works and does what I want it to do without issue, but even if I put in the pre-start

sudo mkdir /home/umbrel/test

it doesn’t do it. It’s really strange, because it works on the mini-pc node, but not on the pi node.

Those logs confirm that systemd is finding and executing the hook, but the script is exiting successfully without doing what you expect. Since sourcing it works, the difference is likely something inside the script relying on your interactive shell.

Don’t change the file yet. Run it under a clean environment with tracing:

HOOK="/home/umbrel/umbrel/custom-hooks/pre-start"

sudo head -n 1 "$HOOK"

sudo env -i \
  HOME=/root \
  USER=root \
  LOGNAME=root \
  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
  /bin/bash -x "$HOOK"

echo "exit code: $?"

That should show whether it exits early, only defines functions without calling them, uses a relative path, or expects something from your normal shell. If the first line isn’t #!/bin/bash or #!/usr/bin/env bash, fix that first.

Be careful not to post the trace without removing any passwords, tokens, or other secrets.

Really sorry this thread has turned out to be so long, lol :joy:. This baffles me as much as it probably baffles you right now. For context, what I wanted to do was make an auto-script that runs and puts back any customisations I have put into place, and then I was going to make a post about it here to share this script for others to find. I got the script working on my mini-pc perfectly fine. The original initialisation script that makes the custom-hooks folder, creates and imports the pre-start script and gives the correct permissions, all in one initialisation script. and it works. But the moment I went to try it out on my Raspberry Pi install, everything executes as it’s supposed to, except that on reboot, nothing happens. The same script works on one device and doesn’t on the other, while I literally copy/paste the exact same code. This is why I thought the RPi4 had a different internal operations, which doesn’t seem to be the case. I don’t mind sharing the script because I was going to share it to everyone once I verified it worked on both devices.

#!/bin/bash

#Set up the file script that will be loaded at every boot.

mkdir -p ~/umbrel/custom-hooks

sudo tee ~/umbrel/custom-hooks/pre-start << ‘EOF’
#!/bin/bash

#Define the variables that define what will be changed in the .yml file and the location of the file

#In this case, we’re turning off the need to log into umbrel in order to access the app

param_location=‘.services.app_proxy.environment.PROXY_AUTH_ADD = “false”’
app_location=“/home/umbrel/umbrel/app-data/”

#Place apps you want to load without umbrel proxy into this array, with spaces
#here are some suggestions
#gitea hermes-agent jellyseerr super-productivity invidious tubearchivist
#ittools technitium-dns code-server heimdall ntfy stirling-pdf termix woofbot
apps=(“termix” “jellyseerr” “heimdall” “stirling-pdf” “super-productivity”)

#Loop through the apps and their yml files so that it reapplies any changes that gets wiped during updates or reboots

for app in “${apps[@]}”; do
yq -i “${param_location}” “${app_location}${app}/docker-compose.yml”;
done;

#Individual customisations
#To make the ntfy work with my own domain
yq -i ‘.services.app.environment.NTFY_BASE_URL = “http://mydomain.com”’ “${app_location}ntfy/docker-compose.yml”

#Add my own local DNS to seerr

yq -i ‘.services.server.dns = [“127.0.0.1”, “192.168.0.11”]’ “${app_location}jellyseerr/docker-compose.yml”
EOF

#Give script the correct permissions

sudo chmod +x ~/umbrel/custom-hooks/pre-start

This is what is supposed to execute, and it does.

When I do your instructions above, it also seems to work in the command line. This is the output:

#!/bin/bash

  • sudo mkdir -p /home/umbrel/test
  • param_location=‘.services.app_proxy.environment.PROXY_AUTH_ADD = “false”’
  • app_location=/home/umbrel/umbrel/app-data/
  • apps=(“termix” “jellyseerr” “heimdall” “stirling-pdf” “super-productivity”)
  • for app in “${apps[@]}”
  • yq -i ‘.services.app_proxy.environment.PROXY_AUTH_ADD = “false”’ /home/umbrel/umbrel/app-data/termix/docker-compose.yml
  • for app in “${apps[@]}”
  • yq -i ‘.services.app_proxy.environment.PROXY_AUTH_ADD = “false”’ /home/umbrel/umbrel/app-data/jellyseerr/docker-compose.yml
  • for app in “${apps[@]}”
  • yq -i ‘.services.app_proxy.environment.PROXY_AUTH_ADD = “false”’ /home/umbrel/umbrel/app-data/heimdall/docker-compose.yml
  • for app in “${apps[@]}”
  • yq -i ‘.services.app_proxy.environment.PROXY_AUTH_ADD = “false”’ /home/umbrel/umbrel/app-data/stirling-pdf/docker-compose.yml
  • for app in “${apps[@]}”
  • yq -i ‘.services.app_proxy.environment.PROXY_AUTH_ADD = “false”’ /home/umbrel/umbrel/app-data/super-productivity/docker-compose.yml
  • yq -i ‘.services.app.environment.NTFY_BASE_URL = “http://mydomain.com”’ /home/umbrel/umbrel/app-data/ntfy/docker-compose.yml
  • yq -i ‘.services.server.dns = [“127.0.0.1”, “192.168.0.11”]’ /home/umbrel/umbrel/app-data/jellyseerr/docker-compose.yml

exit code: 0

and the test command to make a new directory called ‘test’ gets made…Yet, when I reboot, nothing, lol.


Update


But, just before posting the above, I thought I would try to reboot to see if anything fixed itself as I was explaining the above, and now nothing. It stopped booting. No login screen via umbrel.local, no connection to network, couldn’t even ping it. I connected it to a monitor to see what was going on, and it took me to a black screen with simply “user login”. I tried putting in the normal ssh credentials and it couldn’t work, so I have no idea what to do there. I tried everything I could think of, I even took the external hard drive, connected it to another linux computer, and renamed the custom-hooks folder (effectively temporarily deleting it), thinking it was maybe something in the pre-start file that stoped it, and I got the same result.
I then simply downloaded another image from Releases · getumbrel/umbrel · GitHub for the Raspberry pi 4, refreshed the SD card, and connected it to the network. It connects to the network, gets an IP address, but no login screen via umbrel.local, and my normal ssh credentials don’t work for remote ssh logins.

Not sure what’s going on, but any idea of knowing what’s caused this would help.

when connected to a monitor now, it says:

Your Umbrel is now accessible at:
http://umbrel.local
http://192.168.0.37

But it isn’t. Not on direct IP or URL. Before the problem, my Umbrel was renamed and had a static IP address. The above are both different.

No worries, I think we’ve finally found the reason. There’s a confirmed bug in umbrelOS 1.7.4 on Raspberry Pi setups that boot from an SD card and store Umbrel data on an external SSD. The pre-start service runs before the SSD is mounted, so it can’t see the hook. That explains why the same script works on your mini PC and when you run it manually after the Pi has booted.

It’s already been reported and fixed for the next release: custom pre-start hook runs before external storage is mounted on Raspberry Pi · Issue #2206 · getumbrel/umbrel · GitHub

The hook probably didn’t cause the current boot problem. Its wrapper is designed not to block startup, and you already ruled it out by renaming the folder.

Since you’ve reflashed the SD card, reconnect the original external SSD and try logging in directly on the Pi with:

username: umbrel
password: umbrel

Then run:

sudo systemctl status umbrel-external-storage.service umbrel.service --no-pager
sudo journalctl -b -u umbrel-external-storage.service -u umbrel.service --no-pager -n 200
lsblk -f
findmnt /home/umbrel/umbrel
sudo ss -ltnp | grep ':80 '

The address shown on the monitor confirms the Pi has a network connection, but not that Umbrel itself started. These commands should show whether the external SSD mounted properly and why the web interface isn’t loading.

Phew!! Thought I was going crazy there for a second!!

So the output for the above, as I was able to ssh into it with the above credentials

sudo systemctl status umbrel-external-storage.service umbrel.service --no-pager

output:

umbrel-external-storage.service - External Storage Mounter

 Loaded: loaded (/etc/systemd/system/umbrel-external-storage.service; **enabled**; preset: **enabled**)

 Active: **active (exited)** since Wed 2026-08-12 22:19:30 UTC; 11h ago

Invocation: c45a1d93fe6c44bdb0a798c45db3dff8

Process: 353 ExecStart=/opt/umbrel-external-storage/umbrel-external-storage (code=exited, status=0/SUCCESS)

Main PID: 353 (code=exited, status=0/SUCCESS)

Mem peak: 271M

    CPU: 17.880s

Aug 12 22:19:29 umbrel external storage mounter[353]: Bind mounting SD card root at /sd-card…

Aug 12 22:19:29 umbrel external storage mounter[353]: Checking Umbrel root is now on external storage…

Aug 12 22:19:30 umbrel external storage mounter[353]: Checking /var/lib/docker is now on external storage…

Aug 12 22:19:30 umbrel external storage mounter[353]: Checking /swap is now on external storage…

Aug 12 22:19:30 umbrel external storage mounter[353]: Setting up swapfile

Aug 12 22:19:30 umbrel external storage mounter[628]: Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)

Aug 12 22:19:30 umbrel external storage mounter[628]: no label, UUID=39c235796-e38d-486e-bc0d-a457cdabadfe

Aug 12 22:19:30 umbrel external storage mounter[353]: Checking SD Card root is bind mounted at /sd-root…

Aug 12 22:19:30 umbrel external storage mounter[353]: Mount script completed successfully!

Aug 12 22:19:30 umbrel systemd[1]: Finished umbrel-external-storage.service - External Storage Mounter.

umbrel.service - Umbrel daemon

 Loaded: loaded (/etc/systemd/system/umbrel.service; **enabled**; preset: **enabled**)

 Active: **active (running)** since Thu 2026-08-13 09:26:34 UTC; 3s ago

Invocation: cd4ad8ad0d2f42c6bb2435b9ab7c2aee

Main PID: 435534 (node)

  Tasks: 23 (limit: 8782)

 Memory: 100.4M (peak: 100.4M)

    CPU: 6.617s

 CGroup: /system.slice/umbrel.service

         ├─435534 node /opt/umbreld/node_modules/.bin/tsx /opt/umbreld/./source/cli.ts --data-directory=/home/umbrel/umbrel

         └─435558 /usr/local/bin/node --require /opt/umbreld/node_modules/tsx/dist/preflight.cjs --import file:///opt/umbreld/node_modules/tsx/dist/loader.mjs /opt/umbr…

Aug 13 09:26:34 umbrel systemd[1]: umbrel.service: Scheduled restart job, restart counter is at 5934.

Aug 13 09:26:34 umbrel systemd[1]: Started umbrel.service - Umbrel daemon.

The next line of code:

sudo journalctl -b -u umbrel-external-storage.service -u umbrel.service --no-pager -n 200

This gave a massive blob of error data, but here are the highlights:

Aug 13 09:33:16 umbrel umbreld[439897]: [umbreld ] :umbrella: Starting Umbrel v1.7.4

Aug 13 09:33:16 umbrel umbreld[439897]: [umbreld ]

Aug 13 09:33:16 umbrel umbreld[439897]: [umbreld ] dataDirectory: /home/umbrel/umbrel

Aug 13 09:33:16 umbrel umbreld[439897]: [umbreld ] port: 80

Aug 13 09:33:16 umbrel umbreld[439897]: [umbreld ] logLevel: normal

Aug 13 09:33:16 umbrel umbreld[439897]: [umbreld ]

Aug 13 09:33:16 umbrel umbreld[439897]: [umbreld ] Committing OS partition…

Aug 13 09:33:16 umbrel umbreld[439897]: [umbreld ] Successfully commited to new OS partition.

Aug 13 09:33:16 umbrel umbreld[439897]: [migration ] Checking if any migrations are needed…

Aug 13 09:33:16 umbrel umbreld[439897]: [umbreld ] Set ondemand cpu governor

Aug 13 09:33:16 umbrel umbreld[439897]: [migration ] [error] Failed to migrate Back That Mac Up app

Aug 13 09:33:16 umbrel umbreld[439897]: YAMLException: null byte is not allowed in input (1:94)

Aug 13 09:33:16 umbrel umbreld[439897]: [47B blob data]

Aug 13 09:33:16 umbrel umbreld[439897]: -----------------------------------------^

Aug 13 09:33:16 umbrel umbreld[439897]: 2 | …

Aug 13 09:33:16 umbrel umbreld[439897]: 3 | …

Aug 13 09:33:16 umbrel umbreld[439897]: at generateError (file:///opt/umbreld/node_modules/js-yaml/dist/js-yaml.mjs:1273:10)

Aug 13 09:33:16 umbrel umbreld[439897]: at throwError (file:///opt/umbreld/node_modules/js-yaml/dist/js-yaml.mjs:1277:9)

Aug 13 09:33:16 umbrel umbreld[439897]: at loadDocuments (file:///opt/umbreld/node_modules/js-yaml/dist/js-yaml.mjs:2766:5)

Aug 13 09:33:16 umbrel umbreld[439897]: at Object.load$1 [as decode] (file:///opt/umbreld/node_modules/js-yaml/dist/js-yaml.mjs:2804:19)

Aug 13 09:33:16 umbrel umbreld[439897]: at #read (file:///opt/umbreld/source/modules/utilities/file-store.ts:1:758)

Aug 13 09:33:16 umbrel umbreld[439897]: at async FileStore.get (file:///opt/umbreld/source/modules/utilities/file-store.ts:1:1531)

Aug 13 09:33:16 umbrel umbreld[439897]: at async Migration.migrateBackThatMacUpPort (file:///opt/umbreld/source/modules/startup-migrations/index.ts:1:4112)

Aug 13 09:33:16 umbrel umbreld[439897]: at async Migration.start (file:///opt/umbreld/source/modules/startup-migrations/index.ts:1:6063)

Aug 13 09:33:16 umbrel umbreld[439897]: at async Umbreld.start (file:///opt/umbreld/source/index.ts:1:2842)

Aug 13 09:33:16 umbrel umbreld[439897]: at async file:///opt/umbreld/source/cli.ts:15:601 {

Aug 13 09:33:16 umbrel umbreld[439897]: reason: ‘null byte is not allowed in input’,

Aug 13 09:33:16 umbrel umbreld[439897]: mark: {

Aug 13 09:33:16 umbrel umbreld[439897]: name: null,

skipping over a massive data dump section with some URL’s and stuff, and then there’s what looks like the contents of the /umbrel/umbrel.yaml file:

Then more data bump. skipping over:

position: 93,

Aug 13 09:33:16 umbrel umbreld[439897]: line: 0,

Aug 13 09:33:16 umbrel umbreld[439897]: column: 93,

Aug 13 09:33:16 umbrel umbreld[439897]: snippet: ’ 1 | … AAAA 2a01:b740:1360:1::11U=\f\n’ +

Aug 13 09:33:16 umbrel umbreld[439897]: ‘-----------------------------------------^\n’ +

Aug 13 09:33:16 umbrel umbreld[439897]: ’ 2 | … \n’ +

Aug 13 09:33:16 umbrel umbreld[439897]: ’ 3 | … ’

Aug 13 09:33:16 umbrel umbreld[439897]: }

Aug 13 09:33:16 umbrel umbreld[439897]: }

Aug 13 09:33:16 umbrel umbreld[439897]: YAMLException: null byte is not allowed in input (1:94)

Aug 13 09:33:16 umbrel umbreld[439897]: [47B blob data]

Aug 13 09:33:16 umbrel umbreld[439897]: -----------------------------------------^

2 | …

Aug 13 09:33:16 umbrel umbreld[439897]: 3 | …

Aug 13 09:33:16 umbrel umbreld[439897]: at generateError (file:///opt/umbreld/node_modules/js-yaml/dist/js-yaml.mjs:1273:10)

Aug 13 09:33:16 umbrel umbreld[439897]: at throwError (file:///opt/umbreld/node_modules/js-yaml/dist/js-yaml.mjs:1277:9)

Aug 13 09:33:16 umbrel umbreld[439897]: at loadDocuments (file:///opt/umbreld/node_modules/js-yaml/dist/js-yaml.mjs:2766:5)

Aug 13 09:33:16 umbrel umbreld[439897]: at Object.load$1 [as decode] (file:///opt/umbreld/node_modules/js-yaml/dist/js-yaml.mjs:2804:19)

Aug 13 09:33:16 umbrel umbreld[439897]: at #read (file:///opt/umbreld/source/modules/utilities/file-store.ts:1:758)

Aug 13 09:33:16 umbrel umbreld[439897]: at async FileStore.get (file:///opt/umbreld/source/modules/utilities/file-store.ts:1:1531)

Aug 13 09:33:16 umbrel umbreld[439897]: at async Migration.start (file:///opt/umbreld/source/modules/startup-migrations/index.ts:1:6323)

Aug 13 09:33:16 umbrel umbreld[439897]: at async Umbreld.start (file:///opt/umbreld/source/index.ts:1:2842)

Aug 13 09:33:16 umbrel umbreld[439897]: at async file:///opt/umbreld/source/cli.ts:15:601 {

Aug 13 09:33:16 umbrel umbreld[439897]: reason: ‘null byte is not allowed in input’,

Aug 13 09:33:16 umbrel umbreld[439897]: mark: {

Aug 13 09:33:16 umbrel umbreld[439897]: name: null,

This continues a few more times until we get to the final bit:

Aug 13 09:33:16 umbrel umbreld[439897]: position: 93,

Aug 13 09:33:16 umbrel umbreld[439897]: line: 0,

Aug 13 09:33:16 umbrel umbreld[439897]: column: 93,

Aug 13 09:33:16 umbrel umbreld[439897]: snippet: ’ 1 | … AAAA 2b02:c310:2340:1::11U=\f\n’ +

Aug 13 09:33:16 umbrel umbreld[439897]: ‘-----------------------------------------^\n’ +

Aug 13 09:33:16 umbrel umbreld[439897]: ’ 2 | … \n’ +

Aug 13 09:33:16 umbrel umbreld[439897]: ’ 3 | … ’

Aug 13 09:33:16 umbrel umbreld[439897]: }

Aug 13 09:33:16 umbrel umbreld[439897]: }

Aug 13 09:33:16 umbrel systemd[1]: umbrel.service: Main process exited, code=exited, status=1/FAILURE

Aug 13 09:33:16 umbrel systemd[1]: umbrel.service: Failed with result ‘exit-code’.

Aug 13 09:33:16 umbrel systemd[1]: umbrel.service: Consumed 10.866s CPU time, 156.4M memory peak.

Aug 13 09:33:17 umbrel systemd[1]: umbrel.service: Scheduled restart job, restart counter is at 5994.

Aug 13 09:33:17 umbrel systemd[1]: Started umbrel.service - Umbrel daemon.

The most noteworthy thing at the top is where it says “Failed to migrate Back That Mac Up app”. I haven’t used installed that app or had it on my pi for years. It must still somehow have remnants in the system.

Next bit:

lsblk -f

NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS

sda

`-sda1 ext4 1.0 umbrel d374d9b4-37b9-4588-9745-3f893a7928fe 80.7G 91% /mnt/root/swap

                                                                                /swap

                                                                                /data/umbrel-os/var/lib/docker

                                                                                /mnt/root/var/lib/docker

                                                                                /var/lib/docker

                                                                                /data/umbrel-os/home/umbrel/umbrel

                                                                                /mnt/root/home/umbrel/umbrel

                                                                                /home/umbrel/umbrel

                                                                                /mnt/root/mnt/data

                                                                                /mnt/data

mmcblk0

|-mmcblk0p1 vfat FAT16 5669-5689 255M 0% /run/rugix/mounts/config

|-mmcblk0p2 vfat FAT16 566B-4CB9

|-mmcblk0p3

|-mmcblk0p4 ext4 1.0 12341234-a4ec-4304-a70f-c529ea829da9 398.3M 85% /run/rugix/mounts/system

|-mmcblk0p5

`-mmcblk0p6 ext4 1.0 data ca86cd41-0d4f-45c4-a92f-1d3e86f92f80 105.3G 0% /mnt/root/var/lib/systemd/timesync

                                                                                /var/lib/systemd/timesync

                                                                                /mnt/root/var/log

                                                                                /var/log

                                                                                /mnt/root/home

                                                                                /home

                                                                                /mnt/root/var/lib/docker

                                                                                /var/lib/docker

                                                                                /mnt/root/kopia

                                                                                /kopia

                                                                                /data

                                                                                /run/rugix/state

                                                                                /run/rugix/mounts/data

zram0 swap 1 zram0 53a69540-6893-448c-9735-2548e1b5c0f1 [SWAP]

Then…

findmnt /home/umbrel/umbrel

output:

TARGET SOURCE FSTYPE OPTIONS

/home/umbrel/umbrel /dev/sda1[/umbrel] ext4 rw,relatime

and finally:

sudo ss -ltnp | grep ':80 '

Gives no output,

Phew, the good news is your SSD is mounting properly. I think we’ve found the actual problem now.

Your /home/umbrel/umbrel/umbrel.yaml file has some null bytes in it, which means Umbrel can’t read it and keeps restarting. The Back That Mac Up error is a bit misleading. It’s just the first thing that tries to read the file, so that old app isn’t causing this.

You can clean up the file while keeping a copy of the original:

sudo systemctl stop umbrel.service

FILE=/home/umbrel/umbrel/umbrel.yaml
BACKUP="${FILE}.corrupt-$(date +%Y%m%d-%H%M%S)"

sudo cp -a "$FILE" "$BACKUP"
sudo perl -pe 's/\x00//g' "$FILE" | sudo tee "${FILE}.repaired" >/dev/null
sudo chmod 600 "${FILE}.repaired"

sudo /usr/local/bin/node \
  /opt/umbreld/node_modules/js-yaml/bin/js-yaml.js \
  "${FILE}.repaired" >/dev/null

If that last command returns to the prompt without an error, run:

sudo mv "${FILE}.repaired" "$FILE"
sudo systemctl start umbrel.service
sleep 15
sudo systemctl status umbrel.service --no-pager
sudo ss -ltnp | grep ':80 '

Hopefully that should bring the web interface back. If the YAML check prints an error, stop there and share just that error. Don’t post the contents of umbrel.yaml, since it contains private account and system details.

So…I’ll try to keep this brief

sudo perl -pe 's/\x00//g' "$FILE" | sudo tee "${FILE}.repaired" >/dev/null

give me:

perl: warning: Setting locale failed.

perl: warning: Please check that your locale settings:

LANGUAGE = (unset),

LC_ALL = (unset),

LC_CTYPE = “UTF-8”,

LC_NUMERIC = (unset),

LC_COLLATE = (unset),

LC_TIME = (unset),

LC_MESSAGES = (unset),

LC_MONETARY = (unset),

LC_ADDRESS = (unset),

LC_IDENTIFICATION = (unset),

LC_MEASUREMENT = (unset),

LC_PAPER = (unset),

LC_TELEPHONE = (unset),

LC_NAME = (unset),

LANG = “C.UTF-8”

are supported and installed on your system.

perl: warning: Falling back to a fallback locale (“C.UTF-8”).

Substitution replacement not terminated at -e line 1.

I wasn’t sure if these were ‘errors’ as warnings aren’t necessarily bad…

Then:

sudo /usr/local/bin/node \
  /opt/umbreld/node_modules/js-yaml/bin/js-yaml.js \
  "${FILE}.repaired" >/dev/null

gave me:

YAMLException: the stream contains non-printable characters (1:346)

1 | … 01a1051.dscg4.akamai.netA→(some weird characters):

-----------------------------------------^

2 | …

3 | …

and then with:

sudo systemctl status umbrel.service --no-pager

We get this on loop:

umbrel.service - Umbrel daemon

 Loaded: loaded (/etc/systemd/system/umbrel.service; **enabled**; preset: **enabled**)

 Active: **active (running)** since Fri 2026-08-14 00:31:00 UTC; 2s ago

Invocation: 0f8a7e41a7d9445a8bbac7623e3f6270

Main PID: 1021889 (node)

  Tasks: 23 (limit: 8782)

 Memory: 74.6M (peak: 74.6M)

    CPU: 3.006s

 CGroup: /system.slice/umbrel.service

         ├─1021889 node /opt/umbreld/node_modules/.bin/tsx /opt/umbreld/./source/cli.ts --data-directory=/home/umbrel/umbrel

         └─1021913 /usr/local/bin/node --require /opt/umbreld/node_modules/tsx/dist/preflight.cjs --import file:///opt/umbreld/node_modules/tsx/dist/loader.mjs /opt/umbreld/./source/cli.ts --data-directory=/home/umbrel/umbrel

then:

 snippet: ' 1 |  ... 01\x03a1051.dscg4.akamai.netA(those weird characters again):\n' +
Aug 14 00:33:48 umbrel umbreld[1023691]:       '-----------------------------------------^\n' +
Aug 14 00:33:48 umbrel umbreld[1023691]:       ' 2 |  ... \n' +
Aug 14 00:33:48 umbrel umbreld[1023691]:       ' 3 |  ... '
Aug 14 00:33:48 umbrel umbreld[1023691]:   }
Aug 14 00:33:48 umbrel umbreld[1023691]: }
Aug 14 00:33:48 umbrel systemd[1]: umbrel.service: Main process exited, code=exited, status=1/FAILURE
Aug 14 00:33:48 umbrel systemd[1]: umbrel.service: Failed with result 'exit-code'.
Aug 14 00:33:48 umbrel systemd[1]: umbrel.service: Consumed 10.724s CPU time, 149.7M memory peak.
Aug 14 00:33:49 umbrel systemd[1]: umbrel.service: Scheduled restart job, restart counter is at 53.

Do you have any idea what is going on? what caused this?

Yep, and sorry, my last suggestion was too narrow.

The locale warnings are harmless. The important part is Substitution replacement not terminated, which means the Perl command didn’t actually run. But the Akamai hostname and other non-printable characters tell us something more useful. That data should never be inside umbrel.yaml, so the file has been corrupted with unrelated data rather than just picking up a few null bytes.

That’s why umbreld keeps restarting. The status only says active because you’re catching it during the couple of seconds before it crashes again. This isn’t being caused by Back That Mac Up.

Don’t replace the original with the repaired file. Stop the restart loop and check whether there’s another valid copy:

sudo systemctl stop umbrel.service

PARSER=/opt/umbreld/node_modules/js-yaml/bin/js-yaml.js

for f in /home/umbrel/umbrel/umbrel.yaml /home/umbrel/umbrel/umbrel.yaml.*; do
  [ -f "$f" ] || continue

  if sudo /usr/local/bin/node "$PARSER" "$f" >/dev/null 2>&1; then
    echo "VALID: $f"
  else
    echo "INVALID: $f"
  fi
done

Please share that output. Also, do you still have a recent Umbrel Backup.backup in the new backup location and know its encryption password? If there isn’t a valid local copy, the safest option is to restore just umbrel.yaml from the latest backup rather than trying to remove more damaged bytes.

The exact cause is hard to prove from this log alone, but unrelated data appearing inside the file usually points to storage or filesystem corruption, possibly from a hard power loss, the SSD, or its USB adapter. Don’t post the contents of umbrel.yaml, since it contains private system and account details.

output:

INVALID: /home/umbrel/umbrel/umbrel.yaml

VALID: /home/umbrel/umbrel/umbrel.yaml.1550.10.tmp

VALID: /home/umbrel/umbrel/umbrel.yaml.940.2.tmp

VALID: /home/umbrel/umbrel/umbrel.yaml.942.37.tmp

VALID: /home/umbrel/umbrel/umbrel.yaml.949.3725.tmp

VALID: /home/umbrel/umbrel/umbrel.yaml.959.58.tmp

VALID: /home/umbrel/umbrel/umbrel.yaml.965.2765.tmp

BUT…it seems that all these temp files are empty.

ls -al

output:

-rw------- 1 root root 2312 Aug 14 00:22 umbrel.yaml

-rw-r–r-- 1 root root 8698 Aug 12 10:19 ‘umbrel.yaml’$‘\n’

-rw-r–r-- 1 root root 0 Apr 29 14:47 umbrel.yaml.1550.10.tmp

-rw-r–r-- 1 root root 0 Aug 11 20:28 umbrel.yaml.940.2.tmp

-rw-r–r-- 1 root root 0 Apr 29 10:07 umbrel.yaml.942.37.tmp

-rw-r–r-- 1 root root 0 Apr 18 19:41 umbrel.yaml.949.3725.tmp

-rw-r–r-- 1 root root 0 Apr 9 14:47 umbrel.yaml.959.58.tmp

-rw-r–r-- 1 root root 0 May 17 13:13 umbrel.yaml.965.2765.tmp

I have no backups really of it. I did, but I deleted it because I was moving things around and I don’t really have any sensitive data on it besides some media files. There’s no Crypto related stuff on it.

Is there a way to simply bypass this, start again (if need be) and just use the data related to some Jellyfin/seerr stuff that’s already on the drive moving forward? It looks like this necessary file is corrupted and there doesn’t seem to be any backups with the relevant data.

I also tested the file above " ‘umbrel.yaml’$‘\n’" and it is also invalid.

Yep, those temp files only show as valid because an empty file is technically valid YAML. They don’t contain anything useful.

Since you don’t have a backup and you’re okay with setting Umbrel up again, we can reset only the broken state file. Your app data and media will stay on the drive. You’ll just need to recreate the Umbrel account, reinstall the apps, and set up network shares and backups again.

Run this:

ROOT=/home/umbrel/umbrel
RECOVERY="$ROOT/recovery-corrupt-yaml"

sudo systemctl stop umbrel.service
sudo install -d -m 700 "$RECOVERY"

sudo find "$ROOT/app-data" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' \
  | sudo tee "$RECOVERY/app-list.txt" >/dev/null

sudo mv "$ROOT/umbrel.yaml" \
  "$RECOVERY/umbrel.yaml.corrupt-$(date +%Y%m%d-%H%M%S)"

sudo systemctl start umbrel.service
sleep 15
sudo systemctl status umbrel.service --no-pager
sudo ss -lntp | grep ':80 '

Leave the oddly named file and empty temp files alone for now. Once port 80 is listening, open the IP shown on the monitor and create a new Umbrel account.

Before reinstalling Jellyfin and Seerr, make a copy of their existing configs:

ROOT=/home/umbrel/umbrel
RECOVERY="$ROOT/recovery-corrupt-yaml"
STAMP=$(date +%Y%m%d-%H%M%S)

for app in jellyfin jellyseerr; do
  src="$ROOT/app-data/$app/data/config"
  [ -d "$src" ] && sudo cp -a "$src" "$RECOVERY/${app}-config-$STAMP"
done

Then install Jellyfin and Seerr normally from the App Store. The installer will refresh the app files but reuse the existing data/config folders, so your Jellyfin library, users, and Seerr settings should come back. Your media files won’t be removed. If the media was on a network share, reconnect it using the same path Jellyfin had before.