# Docker Port Binding and Tailscale Reachability

When Docker containers bind to `127.0.0.1` (loopback), they are only reachable from the host machine. Tailscale traffic arrives on the `tailscale0` interface and cannot reach `127.0.0.1`-bound ports.

## Detection

From the VPS via Tailscale:

```bash
# Port returns 000 (connection refused) — likely 127.0.0.1 binding
curl -s -o /dev/null -w '%{http_code}' --connect-timeout 2 http://100.93.253.36:9925/
# 000
```

On the home server, verify the binding:

```bash
docker inspect <container> --format '{{json .HostConfig.PortBindings}}' | python3 -m json.tool
# {"9000/tcp": [{"HostIp": "127.0.0.1", "HostPort": "9925"}]}
```

## Solutions

### Option A: Proxy through home nginx (preferred)

The home server's nginx already has SSL configs for these services on ports 3443-3450. From the VPS, proxy to the home nginx SSL endpoint with SNI:

```nginx
proxy_pass https://100.93.253.36:3449;   # Mealie via home nginx
proxy_ssl_verify off;
proxy_ssl_server_name on;
proxy_ssl_name grajmedia.duckdns.org;
proxy_set_header Host grajmedia.duckdns.org;
```

This works because the home nginx listens on `0.0.0.0:3449` and proxies to `127.0.0.1:9925` locally.

### Option B: Rebind container to 0.0.0.0

Stop the container, recreate with `0.0.0.0` binding:

```bash
docker stop mealie
docker rm mealie
docker run -d --name mealie \
  -p 0.0.0.0:9925:9000 \
  ... (rest of original options)
```

**Downside**: the service becomes accessible on the LAN without SSL. Only do this for services that don't need the home nginx SSL layer.

### Option C: SSH tunnel

As a last resort, create an SSH tunnel from VPS to home server:

```bash
ssh -L 9925:127.0.0.1:9925 -N -f 100.93.253.36
```

Then nginx on the VPS proxies to `http://127.0.0.1:9925`.

**Downside**: fragile, needs SSH keepalive, adds latency, requires SSH key setup.

## Services by binding type (rayserver)

| Service | Docker port | Binding | VPS approach |
|---------|------------|---------|-------------|
| Immich | 2283 | 0.0.0.0 | Direct HTTP |
| Paperless | 8010 | 0.0.0.0 | Direct HTTP |
| Home Assistant | 8123 | 0.0.0.0 (host net) | Direct HTTP |
| Mealie | 9925 | 127.0.0.1 | Home nginx HTTPS proxy |
| Audiobookshelf | 13378 | 0.0.0.0 | Direct HTTP |
| PocketBase | 8091 | 127.0.0.1 | Home nginx HTTPS proxy |
