"""Was in welchem Container steckt (Community-Scripts-Kennung aus /usr/bin/update im Gast). Stand der Bestandsaufnahme vom 24.09.2026: sechs Container, alle mit dem Etikett community-script. Neue Container mit dem Etikett erscheinen von selbst; fehlt ihre Kennung hier, zeigt die Übersicht sie ohne Versionsvergleich und ohne Webprüfung — nachtragen genügt. """ from dataclasses import dataclass @dataclass(frozen=True) class App: kennung: str name: str quelle: str | None = None # GitHub owner/repo für die neueste Version; None = über die Pakete des Gasts vergleich: str = "version" # „version“ oder „datum“ (Docker-Images ohne Versionsnummer) port: int | None = None # Weboberfläche; None = keine (z. B. NetBird-Client) https: bool = False pfad: str = "/" KATALOG: dict[str, App] = {a.kennung: a for a in ( App("adguard", "AdGuard Home", "AdguardTeam/AdGuardHome", port=8080), App("npmplus", "NPMplus", "ZoeyVid/NPMplus", vergleich="datum", port=81, https=True), App("netbird", "NetBird", "netbirdio/netbird"), App("pve-scripts-local", "PVE Scripts Local", "community-scripts/ProxmoxVE-Local", port=3000), App("gitea", "Gitea", "go-gitea/gitea", port=3000), App("proxmox-backup-server", "Proxmox Backup Server", port=8007, https=True), )} # Gäste, die keine Community-Scripts sind, erkennt man am Namen. NACH_NAME: dict[str, App] = { "arcane": App("arcane", "Arcane (Docker)", port=3552), } def app_fuer(kennung: str | None, name: str | None) -> App | None: if kennung and kennung in KATALOG: return KATALOG[kennung] return NACH_NAME.get(str(name or "").lower()) def adresse(app: App | None, ip: str | None) -> str | None: """Adresse der Weboberfläche, falls es eine gibt und die IP bekannt ist.""" if not app or not app.port or not ip: return None return f"{'https' if app.https else 'http'}://{ip}:{app.port}{app.pfad}"