How to Auto-Start Custom Docker Apps on Umbrel After a Windows Reboot

In my previous post, we successfully decoupled our custom apps (Grocy, Joplin, and Syncthing) from the Umbrel App Store, running them in standalone, stable Docker Compose stacks. This significantly improved our server stability, but it introduced one key point of friction: What happens when the power goes out?

When an Umbrel server reboots, its internal scripts automatically spin up all the official apps you installed from its built-in store. However, Umbrel doesn’t know our custom /custom-stacks/ directories exist, which means our self-hosted Grocy and Joplin instances stay offline until we manually start them.

Because my Umbrel server runs on a VMware Virtual Machine hosted on a Windows PC, I decided to fix this from the host machine. Here is the exact Windows PowerShell script and Task Scheduler setup I use to automatically ignite my custom apps whenever the server boots up, ensuring they are always available alongside my official Umbrel apps.

Step 1: Passwordless SSH Access (The Prerequisite)

For a Windows script to automatically run commands on your Umbrel server, Windows needs to be able to log in without prompting you to type a password. We achieve this by generating an SSH key on Windows and copying it to the Umbrel server. Many self-hosters already have this setup for easy SSH access, but it is critical for this automation script to function silently.

  1. Generate SSH Key on Windows: Open Windows PowerShell and run ssh-keygen (press Enter to accept all the defaults).
  2. Push the Key to Umbrel: Run this command (it will ask for your Umbrel password one last time):
    type $env:USERPROFILE\.ssh\id_rsa.pub | ssh umbrel@192.168.29.123 "cat >> .ssh/authorized_keys"
    (After this, Windows can log in silently).

Step 2: The Ignition Script

Now we write the PowerShell script that acts as the starter motor. It simply SSHs into the server, navigates to each app directory, and triggers the docker compose command.

Open Notepad on Windows, paste the following code, and save it to your desktop (or a secure scripts folder) as Start_Custom_Apps.ps1. Be sure to update the server IP, file paths, and paths for each app to match your own specific setup.

# Start_Custom_Apps.ps1
# This script connects to the Umbrel VM and starts custom Docker stacks

Write-Host "Connecting to Umbrel to start custom apps..."

# Start Grocy (on custom port 9283)
ssh umbrel@192.168.29.123 "cd /home/umbrel/custom-stacks/grocy && sudo docker compose up -d"

# Start Joplin Server (on custom port 22300)
ssh umbrel@192.168.29.123 "cd /home/umbrel/custom-stacks/joplin && sudo docker compose up -d"

# Start Syncthing (on port 8384)
ssh umbrel@192.168.29.123 "cd /home/umbrel/custom-stacks/syncthing && sudo docker compose up -d"

Write-Host "Ignition complete. All custom apps are online!"
Start-Sleep -Seconds 5

If you right-click this .ps1 file and click “Run with PowerShell”, a black window will pop up, execute the startup commands on your Umbrel server, and disappear.

Step 3: Automating with Windows Task Scheduler

The script works, but we don’t want to click it manually. We want Windows to run it automatically whenever the computer turns on and the VMware virtual machine boots up.

  1. Open the Windows Start Menu, search for Task Scheduler, and open it.
  2. Click Action -> Create Basic Task… on the right sidebar.
  3. Name it “Umbrel Custom App Ignition”.
  4. For the Trigger, select When the computer starts or When I log on.
  5. For the Action, select Start a program.
  6. In the “Program/script” box, type: powershell.exe
  7. In the “Add arguments” box, type: -ExecutionPolicy Bypass -File "C:\Path\To\Your\Start_Custom_Apps.ps1" (Make sure to update this with your actual file path!)

The Crucial Step: The Delay

When Windows boots up, it takes a couple of minutes for VMware to load and for the Umbrel Linux environment to fully initialize its Docker daemon. If your script fires instantly, it will fail because Umbrel isn’t awake yet.

  1. Delay Task for 2 Minutes: Before clicking finish, check the box that says “Open the Properties dialog for this task when I click Finish”.
  2. Go to the Triggers tab, double-click your trigger, and check the box for “Delay task for:”. Set it to 2 or 3 minutes.

Click OK and save.

The Result

Your setup is now bulletproof. If Windows reboots, it will automatically load the VMware Umbrel instance. Three minutes later, Task Scheduler will quietly fire your PowerShell script, which logs into Umbrel over SSH and seamlessly spins up Grocy, Joplin, and Syncthing. You never have to manually touch the command line again! Your decoupled, custom apps are always online, automated alongside your official Umbrel apps for a resilient self-hosted ecosystem.

(In the next post, I’ll cover the networking side: How we securely exposed Nextcloud using Cloudflare Tunnels, and how to fix the dreaded “Untrusted Domain” error).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top