diff --git a/ers5952-manager.jsx b/ers5952-manager.jsx
index e2790ff..3606627 100644
--- a/ers5952-manager.jsx
+++ b/ers5952-manager.jsx
@@ -417,7 +417,7 @@ function SessionBtn({ session, onUnlock }) {
// ══════════════════════════════════════════════════════════════════════════════
// SETTINGS PANEL
// ══════════════════════════════════════════════════════════════════════════════
-function SettingsPanel({ settings, setSettings, onClose }) {
+function SettingsPanel({ settings, setSettings, session, onClose }) {
return (
e.stopPropagation()}>
@@ -454,6 +454,29 @@ function SettingsPanel({ settings, setSettings, onClose }) {
+
+
Network
+
+
+
Services / Caddy box LAN IP
+
The computer running Caddy and services (Plex, etc.) — separate from this management computer
+
+
setSettings(s => ({...s, caddyIp: e.target.value}))}
+ placeholder="192.168.1.50"
+ onBlur={() => {
+ if (settings.caddyIp && session?.token) {
+ fetch("/api/services/config", {
+ method:"POST",
+ headers:{"Content-Type":"application/json"},
+ body: JSON.stringify({ token: session.token, config: { caddy_ip: settings.caddyIp } })
+ }).catch(() => {});
+ }
+ }}
+ style={{background:"var(--bg)",border:"1px solid var(--b2)",color:"var(--tx)",
+ padding:"4px 8px",fontFamily:"var(--mono)",fontSize:11,borderRadius:3,width:140}}/>
+
+
+
About
@@ -1473,7 +1496,7 @@ export default function App() {
const [selected, setSelected] = useState(null);
const [hostname, setHostname] = useState("ERS-5952");
const [switchIP, setSwitchIP] = useState("192.168.99.1");
- const [settings, setSettings] = useState({ cliMode: false, defaultPushMode: "batch" });
+ const [settings, setSettings] = useState({ cliMode: false, defaultPushMode: "batch", caddyIp: "" });
const [showSettings, setShowSettings] = useState(false);
const [connState, setConnState] = useState("connecting");
@@ -1487,6 +1510,13 @@ export default function App() {
const updatePort = useCallback(p => setPorts(prev => prev.map(x => x.id===p.id?p:x)), []);
// Heartbeat
+ // Load services config (caddy IP) once on mount
+ useEffect(() => {
+ API("/services/config").then(cfg => {
+ if (cfg.caddy_ip) setSettings(s => ({...s, caddyIp: cfg.caddy_ip}));
+ }).catch(() => {});
+ }, []);
+
useEffect(() => {
let firstPoll = true;
const beat = async () => {
@@ -1660,6 +1690,7 @@ export default function App() {
{showSettings && setShowSettings(false)}
/>}
@@ -5099,14 +5130,12 @@ function ServicesTab({ vlans, session, onNeedAuth, backendOk }) {
const [deploying, setDeploying] = useState(false);
const [deployResult, setDeployResult] = useState(null);
const [actionLoading, setActionLoading] = useState("");
- const [caddyIpInput, setCaddyIpInput] = useState("");
const load = async () => {
try {
const [svc, st] = await Promise.all([API("/services"), API("/services/status")]);
setServices(svc.services || []);
setStatus(st);
- if (st.caddy_ip && !caddyIpInput) setCaddyIpInput(st.caddy_ip);
} catch(e) { console.error(e); }
};
useEffect(() => { if (backendOk) load(); }, [backendOk]);
@@ -5127,17 +5156,6 @@ function ServicesTab({ vlans, session, onNeedAuth, backendOk }) {
await load();
};
- const saveCaddyIp = async () => {
- if (!session) { onNeedAuth(); return; }
- if (!caddyIpInput.trim()) return;
- try {
- await API("/services/config", { method:"POST", body:{
- token: session.token, config: { caddy_ip: caddyIpInput.trim() }
- }});
- await load();
- } catch(e) { alert("Failed: " + e.message); }
- };
-
const enableNatReflection = async () => {
if (!session) { onNeedAuth(); return; }
setActionLoading("nat");
@@ -5216,26 +5234,6 @@ function ServicesTab({ vlans, session, onNeedAuth, backendOk }) {
- {/* Services Host Config */}
-