import { useEffect, useState } from 'react' import { api, runtime } from '../api.js' const SECRET_KEYS = new Set(['POSTGRES_PASSWORD', 'JWT_SECRET', 'ADMIN_UI_PASSWORD']) const WEBUI_KEYS = ['ADMIN_UI_BIND', 'ADMIN_UI_PORT', 'ADMIN_UI_TLS', 'ADMIN_UI_PASSWORD'] export default function SettingsPanel() { const [config, setConfig] = useState({}) const [reveal, setReveal] = useState({}) const [savingKey, setSavingKey] = useState(null) const [error, setError] = useState(null) const [restartHint, setRestartHint] = useState(false) const [autostartEnabled, setAutostartEnabled] = useState(null) // null = unbekannt/lade useEffect(() => { api.getConfig().then(setConfig).catch(e => setError(String(e))) if (runtime === 'tauri') { import('@tauri-apps/plugin-autostart') .then(m => m.isEnabled()) .then(setAutostartEnabled) .catch(() => setAutostartEnabled(false)) } }, []) async function toggleAutostart() { if (runtime !== 'tauri') return try { const mod = await import('@tauri-apps/plugin-autostart') if (autostartEnabled) { await mod.disable() setAutostartEnabled(false) } else { await mod.enable() setAutostartEnabled(true) } } catch (e) { setError(String(e)) } } async function saveKey(key, value) { setSavingKey(key); setError(null) try { await api.setConfigValue(key, value) if (WEBUI_KEYS.includes(key)) setRestartHint(true) } catch (e) { setError(String(e)) } finally { setSavingKey(null) } } function toggleLan() { const next = config.ADMIN_UI_BIND === '0.0.0.0' ? '127.0.0.1' : '0.0.0.0' if (next === '0.0.0.0') { const ok = window.confirm( 'Im LAN freigeben?\n\n' + 'Damit ist die Admin-UI von allen Geraeten im Netzwerk unter ' + `https://.local:${config.ADMIN_UI_PORT || 9090} erreichbar. ` + 'Login bleibt mit User "admin" und dem Passwort aus dieser Settings-Seite geschuetzt. ' + 'Trotzdem: nur in vertrauenswuerdigen Netzen einschalten.' ) if (!ok) return } setConfig(c => ({ ...c, ADMIN_UI_BIND: next })) saveKey('ADMIN_UI_BIND', next) } const lanOn = config.ADMIN_UI_BIND === '0.0.0.0' const entries = Object.entries(config) return (

Einstellungen

{error &&

{error}

} {restartHint && (

Aenderung gespeichert. App neu starten, damit der WebUI-Server mit der neuen Konfiguration laeuft.

)}

Auto-Start

Fuer headless Mac-Mini-Deployments: App startet beim Login automatisch (versteckt im Tray) und faehrt sofort alle Container hoch.

App beim Login starten
{runtime !== 'tauri' ? 'Nur im Tauri-App-Modus verfuegbar (Browser kann das nicht).' : autostartEnabled === null ? 'Lade ...' : autostartEnabled ? `Aktiv: LaunchAgent unter ~/Library/LaunchAgents/` : 'Aus: App startet nicht automatisch beim Login'}
Container nach App-Start hochfahren
Triggert docker compose up -d sobald die App geladen ist. Sinnvoll zusammen mit dem Login-Autostart.

Admin-WebUI

Browser-basierter Zugang zur gleichen Admin-Oberflaeche — nuetzlich wenn diese App auf einem Mac Mini ohne Bildschirm laeuft.

Im LAN freigeben
{lanOn ? `Aktiv: jeder im Netzwerk kann https://.local:${config.ADMIN_UI_PORT || 9090} erreichen` : 'Aus: nur lokal auf diesem Mac (https://127.0.0.1:9090)'}
Port
Default 9090
setConfig(c => ({ ...c, ADMIN_UI_PORT: e.target.value }))} onBlur={e => saveKey('ADMIN_UI_PORT', e.target.value)} className="settings-input" style={{ width: 80, textAlign: 'right' }} />
TLS / HTTPS
Self-signed Cert. Browser warnt einmal, danach akzeptiert.
Passwort (User: admin)
setConfig(c => ({ ...c, ADMIN_UI_PASSWORD: e.target.value }))} onBlur={e => saveKey('ADMIN_UI_PASSWORD', e.target.value)} className="settings-input" style={{ fontFamily: 'ui-monospace, monospace', marginTop: 4 }} />

Alle Werte (Rohzugriff)

Direkter Zugriff auf alle config.env-Eintraege. Aenderungen an DB-relevanten Werten erfordern Stop & Start der Container.

{entries.map(([key, value]) => { const isSecret = SECRET_KEYS.has(key) const shown = !isSecret || reveal[key] return (
{isSecret && ( )} {savingKey === key && speichert ...}
) })}
) }