[public-pool] UI loads but shows no data after Umbrel 2.0 update — nginx upstream IP broken

Update: Additional issue after upgrading to Umbrel 2.0

After upgrading to Umbrel 2.0, Public Pool stopped showing data again despite the previous
WebSocket fix still being in place.

Root Cause

Umbrel 2.0 changed the internal Docker network IP assignments. The nginx proxy had the
old IP 10.21.0.7 hardcoded as upstream for the API, but after the update the
public-pool_server_1 container was reassigned to 10.21.0.7 a new IP (10.21.0.5),
causing all API requests to fail with: connect() failed (111: Connection refused) while connecting to upstream:

http://10.21.0.7:2019/api/info

Fix

Replace the hardcoded IP in the nginx upstream with the container name. Docker resolves
container names to their current IP automatically, so this fix survives reboots and
future updates:

server {
    listen 80;

    location / {
        proxy_pass http://public-pool_web_1:80;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

    location ~* ^/api/ {
        proxy_pass http://public-pool_server_1:2019;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

Steps to apply

sudo bash -c 'cat > /home/umbrel/umbrel/app-data/public-pool/data/proxy/nginx.conf << '"'"'EOF'"'"'
server {
    listen 80;

    location / {
        proxy_pass http://public-pool_web_1:80;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

    location ~* ^/api/ {
        proxy_pass http://public-pool_server_1:2019;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}
EOF'

sudo docker exec public-pool_proxy_1 nginx -t && \
sudo docker exec public-pool_proxy_1 nginx -s reload

Environment

Note

This fix combines both issues reported previously (missing WebSocket headers + hardcoded IP)
into a single robust nginx config. It should survive future Umbrel updates and Docker
network changes since it uses container names instead of IPs for upstream resolution.

One thing worth checking: the App Store’s nginx config already uses container names. nginx still prints the resolved IP in error logs, so seeing 10.21.0.7 there doesn’t necessarily mean it was hardcoded. Was that IP actually in your nginx.conf before you changed it?

There’s also a small catch with the “survives future updates” part: with this config, nginx resolves the container names when it starts or reloads, rather than checking for IP changes continuously. If the backend container’s IP changes while nginx stays running, it can keep trying the old address. Your reload may have been what got it working again.

If it happens again, I’d try restarting Public Pool from the Umbrel dashboard before editing anything. That should make nginx resolve the current addresses again.