Homelab
Plex LAN Configuration
Configuring Plex for the Lab VLAN
Overview
This article completes the Plex migration to the Lab VLAN. Plex in Kubernetes requires additional configuration to work across VLANs: a static IP from MetalLB's static pool, proper IP advertisement to Plex.tv, and LAN network settings so clients on other VLANs are recognized as local.
| Tip: | Having trouble? See v1.4.0 for what your setup should look like after completing this article. |
Before You Begin
Prerequisites
- MetalLB Migration completed
What We're Setting Up
| Component | Before | After |
|---|---|---|
| Service IP | Dynamic from pool | Static 192.168.10.40 |
| ADVERTISE_IP | (none) | LoadBalancer IP |
| LAN Networks | (empty) | Trusted VLAN |
| Custom URL | (none) | LoadBalancer IP |
Why These Settings
Plex in Kubernetes needs explicit configuration for VLAN environments:
- Static IP: Services needing stable URLs should use MetalLB's static pool
- ADVERTISE_IP: Tells Plex to publish the LoadBalancer IP instead of pod IP
- Custom URL: Ensures clients discover the correct address via Plex.tv
- LAN Networks: Clients on Trusted VLAN (192.168.30.x) are treated as local, not remote
Configure Static IP
ConfigMap
Define the IP and ADVERTISE_IP in a ConfigMap, then inject them into the HelmRelease using valuesFrom. This follows the same pattern used for secrets like plex-claim.
k8s/apps/plex/configmap.yaml:
---
apiVersion: v1
kind: ConfigMap
metadata:
name: plex-vars
namespace: plex
data:
ADVERTISE_IP: "http://192.168.10.40:32400"
PLEX_IP: "192.168.10.40" HelmRelease
Add valuesFrom entries to inject the ConfigMap values at the correct paths. The backslash escapes the dots in the annotation key.
k8s/apps/plex/helmrelease.yaml (HelmRelease section):
# ... existing HelmRepository + HelmRelease header ...
spec:
# ... existing spec.interval, chart ...
valuesFrom:
- kind: Secret
name: plex-claim
valuesKey: claim
targetPath: extraEnv.PLEX_CLAIM
- kind: ConfigMap # ADD
name: plex-vars # ADD
valuesKey: ADVERTISE_IP # ADD
targetPath: extraEnv.ADVERTISE_IP # ADD
- kind: ConfigMap # ADD
name: plex-vars # ADD
valuesKey: PLEX_IP # ADD
targetPath: service.annotations.metallb\.universe\.tf/loadBalancerIPs # ADD
values:
# ... existing image, extraEnv.TZ, service.type, service.port ...
# ... existing pms, extraVolumes, extraVolumeMounts ... Kustomization
Add the ConfigMap to resources:
k8s/apps/plex/kustomization.yaml:
# ... existing header ...
resources:
- namespace.yaml
- configmap.yaml # ADD
- pvc.yaml
- secret.sops.yaml
- helmrelease.yaml Commit Changes
git add k8s/apps/plex/
git commit -m "feat(plex): add static IP and ADVERTISE_IP for cross-VLAN"
git push Reconcile and Restart
flux reconcile source git flux-system
flux reconcile kustomization sync
kubectl rollout restart statefulset -n plex plex-plex-media-server Verify Static IP
kubectl get svc -n plex Expected: External IP shows 192.168.10.40.
Verify Configuration
Check Plex Network Settings
Open Plex Web UI (http://192.168.10.40:32400/web) → Settings → Network → Show Advanced.
Verify these settings are populated1:
- Custom server access URLs:
http://192.168.10.40:32400 - LAN Networks:
192.168.30.0/24
LAN Networks tells Plex to treat Trusted VLAN clients as local (no bandwidth restrictions). Without it, clients from a different subnet would be treated as remote.
Test Streaming
From Apple TV or another Trusted device, play content and verify full quality streaming.
Check Plex Dashboard
In Plex Web UI → Activity → Dashboard:
- Active streams should show "direct play" for local clients
- No bandwidth throttling indicators
Next Steps
With Plex configured for the Lab VLAN, Phase 2 migration is complete. Continue with infrastructure hardening.
See: Tailscale Hardening
Resources
Footnotes
Plex, "Network Settings," support.plex.tv. Accessed: Feb. 26, 2026. [Online]. Available: https://support.plex.tv/articles/200430283-network/ ↩