<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.megbes.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Clawtronics</id>
	<title>MegBes Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.megbes.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Clawtronics"/>
	<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php/Spezial:Beitr%C3%A4ge/Clawtronics"/>
	<updated>2026-09-19T17:27:05Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=LUX&amp;diff=112</id>
		<title>LUX</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=LUX&amp;diff=112"/>
		<updated>2026-08-07T13:56:56Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Mitreisenden Server und Router als mobiles vorkonfiguriertes Netz dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= LUX – D’Lëtzebuerger Sprooch(en) =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Kunde / Träger&lt;br /&gt;
| Zenter fir d’Lëtzebuerger Sprooch&lt;br /&gt;
|-&lt;br /&gt;
| Ausstellung&lt;br /&gt;
| Wanderausstellung „D’Lëtzebuerger Sprooch(en)“&lt;br /&gt;
|-&lt;br /&gt;
| Interne Bezeichnungen&lt;br /&gt;
| LUX, Nowa Lux&lt;br /&gt;
|-&lt;br /&gt;
| Technischer Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;nowalux&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Projektstatus&lt;br /&gt;
| Wanderausstellung; nur zeitweise aufgebaut und in Betrieb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Wanderausstellung beschäftigt sich mit der luxemburgischen Sprache und ihrer Vielfalt. Nach der Projektreferenz von tinetronics umfasst sie annähernd 15 Stationen und setzt MegBes ein, damit Besucherinnen und Besucher Medienangebote mit dem eigenen Smartphone steuern können.&lt;br /&gt;
&lt;br /&gt;
Zu den beschriebenen Angeboten gehören Videostationen, deren Bild auf den Ausstellungsmonitoren und deren Ton auf dem eigenen Smartphone wiedergegeben wird, außerdem ein Quiz zu den luxemburgischen Sprachen und eine Dialektkarte. Medien- und Lichttechnik sind miteinander kombiniert.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-nowalux&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;34615&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Öffentliche MegBes-Adresse&lt;br /&gt;
| noch zu bestätigen&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| startet mit dem mitreisenden Server, sobald das Ausstellungssystem mit Strom versorgt wird&lt;br /&gt;
|-&lt;br /&gt;
| Interner Server / DynDNS&lt;br /&gt;
| Server und Router gehören zum mobilen Ausstellungssystem und reisen mit&lt;br /&gt;
|-&lt;br /&gt;
| Internal-Release&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Angaben zum Container stammen aus der [[Zentraler MegBes-Server – Inventur und Administration|Serverinventur]]. Die Portangabe beschreibt den internen Serverbetrieb und ist keine Aufforderung, den Port direkt öffentlich freizugeben.&lt;br /&gt;
&lt;br /&gt;
Da es sich um eine Wanderausstellung handelt, ist ein nicht erreichbares &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; außerhalb eines Ausstellungszeitraums nicht automatisch eine Störung. Der MegBes-Server und der vorkonfigurierte Router reisen mit der Ausstellung. Sobald beide mit Strom versorgt werden, steht das interne Ausstellungsnetz wieder zur Verfügung; das Netzwerk muss am neuen Ausstellungsort nicht von Grund auf neu eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Nach jedem Aufbau ist dennoch ein kurzer Funktionstest sinnvoll: Server und Router starten, Stationen sind im internen Netz erreichbar und die vorgesehene Verbindung nach außen funktioniert, sofern sie am Standort benötigt wird.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* öffentliche Domain und vorgesehene Zugriffsart&lt;br /&gt;
* aktueller Ausstellungsort und geplanter Betriebszeitraum&lt;br /&gt;
* feste Daten des mitreisenden Servers und Routers sowie benötigter Internetzugang am Ausstellungsort&lt;br /&gt;
* vollständige Stationsliste und projektspezifischer Timer&lt;br /&gt;
* aktuelles Internal-Release&lt;br /&gt;
* Sicherungs- und Wiederherstellungsweg&lt;br /&gt;
* Datum und Ergebnis der nächsten vollständigen Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens, Schlüssel und vollständige DynDNS-Aktualisierungsadressen werden nicht auf dieser Seite gespeichert. Stattdessen wird auf den entsprechenden Eintrag im Passwortmanager verwiesen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Projekt%C3%BCbersicht&amp;diff=111</id>
		<title>Projektübersicht</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Projekt%C3%BCbersicht&amp;diff=111"/>
		<updated>2026-08-07T13:55:01Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: MiQua Guide als eigenständiges Projekt aufgenommen und Sonderabschnitt entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projektübersicht =&lt;br /&gt;
&lt;br /&gt;
Die Übersicht enthält Kundenprojekte sowie interne, private und temporäre Umgebungen. Der Status beschreibt den erwarteten Betrieb; ein planmäßig nicht aufgebautes temporäres Projekt ist keine Störung. Technische Betriebsdaten werden auf getrennten Projektseiten ergänzt. Geheimwerte werden niemals im Wiki gespeichert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Projekt&lt;br /&gt;
! Status&lt;br /&gt;
! Release external&lt;br /&gt;
! Release internal&lt;br /&gt;
! Letzte Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| [[Tine|tine]] || Test; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[HON]] || privat; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[GSE]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[MiQua]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[MiQua Guide]] || aktiv; direkter Zugriff || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu klären || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[BayAM]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[GKP]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[LUX]] || Wanderausstellung; zeitweise || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Limes]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Messe]] || nur bei Messeeinsatz || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Inhalt einer Projektseite ==&lt;br /&gt;
&lt;br /&gt;
Jede Projektseite soll mindestens enthalten:&lt;br /&gt;
&lt;br /&gt;
* vollständiger Projektname und internes Kürzel&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* Domain von megbes-external&lt;br /&gt;
* DynDNS-Adresse oder interne Erreichbarkeit&lt;br /&gt;
* Container-Namen und Portzuordnungen&lt;br /&gt;
* installierte Releases&lt;br /&gt;
* eingesetzte Server- und Stationshardware&lt;br /&gt;
* projektspezifischer Stations-Timer&lt;br /&gt;
* Datum und Ergebnis der letzten Funktionsprüfung&lt;br /&gt;
* bekannte Besonderheiten und offene Aufgaben&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens und Schlüssel werden durch einen Verweis auf den Passwortmanager ersetzt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=MiQua&amp;diff=110</id>
		<title>MiQua</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=MiQua&amp;diff=110"/>
		<updated>2026-08-07T13:55:01Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: MiQua Guide als eigenständiges verwandtes Projekt verlinkt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MiQua – MiQua Showroom =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Einrichtung / Umfeld&lt;br /&gt;
| MiQua – LVR-Jüdisches Museum im Archäologischen Quartier Köln&lt;br /&gt;
|-&lt;br /&gt;
| Projektbezug&lt;br /&gt;
| MiQua Showroom&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;miqua&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der MiQua Showroom wird in den Referenzen von tinetronics im Zusammenhang mit der medientechnischen Unterstützung der LVR-Museen geführt. Der genaue fachliche und technische Einsatz von MegBes wird noch projektspezifisch ergänzt.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/projects_de.html tinetronics – weitere Projekte und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-miqua&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32779&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Eigenständiges, verwandtes Projekt&lt;br /&gt;
| [[MiQua Guide]]&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; soll dauerhaft laufen&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| konkrete Angaben noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* genaue MegBes-Funktionen und Abgrenzung zu [[MiQua Guide]]&lt;br /&gt;
* Ansprechpartner, Domain und Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS, Stationsliste und Timer&lt;br /&gt;
* Internal-Release und letzte vollständige Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=MiQua_Guide&amp;diff=109</id>
		<title>MiQua Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=MiQua_Guide&amp;diff=109"/>
		<updated>2026-08-07T13:55:01Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: MiQua Guide als eigenständiges Projekt angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MiQua Guide =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Projektname&lt;br /&gt;
| MiQua Guide&lt;br /&gt;
|-&lt;br /&gt;
| Technischer Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;miquaguide&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Projektstatus&lt;br /&gt;
| aktiv&lt;br /&gt;
|-&lt;br /&gt;
| Zugriffsart&lt;br /&gt;
| direkter Zugriff ohne vorherige Anmeldung über einen Ticket-Monitor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MiQua Guide ist ein eigenständiges MegBes-Projekt. Der Guide kann die vorgesehenen Stationen direkt ansprechen, ohne dass sich die Nutzerin oder der Nutzer zuvor über einen Ticket-Monitor anmeldet.&lt;br /&gt;
&lt;br /&gt;
Der fachliche Inhalt, die Zielgruppe und die genaue Abgrenzung zum Projekt [[MiQua]] werden noch ergänzt.&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-miquaguide&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32774&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| noch zu klären&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* vollständige Projekt- und Ausstellungsbeschreibung&lt;br /&gt;
* genaue Abgrenzung und technische Verbindungen zu [[MiQua]]&lt;br /&gt;
* Ansprechpartner und öffentliche Domain&lt;br /&gt;
* Begründung und Schutzmaßnahmen für den direkten Zugriff&lt;br /&gt;
* lokaler Server, Stationsliste und projektspezifischer Timer&lt;br /&gt;
* Internal-Release und letzte vollständige Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens und Schlüssel werden nicht auf dieser Seite gespeichert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Projekt%C3%BCbersicht&amp;diff=108</id>
		<title>Projektübersicht</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Projekt%C3%BCbersicht&amp;diff=108"/>
		<updated>2026-08-07T13:50:13Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Dauerhaften und temporären Internal-Betrieb unterschieden&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projektübersicht =&lt;br /&gt;
&lt;br /&gt;
Die Übersicht enthält Kundenprojekte sowie interne, private und temporäre Umgebungen. Der Status beschreibt den erwarteten Betrieb; ein planmäßig nicht aufgebautes temporäres Projekt ist keine Störung. Technische Betriebsdaten werden auf getrennten Projektseiten ergänzt. Geheimwerte werden niemals im Wiki gespeichert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Projekt&lt;br /&gt;
! Status&lt;br /&gt;
! Release external&lt;br /&gt;
! Release internal&lt;br /&gt;
! Letzte Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| [[Tine|tine]] || Test; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[HON]] || privat; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[GSE]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[MiQua]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[BayAM]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[GKP]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[LUX]] || Wanderausstellung; zeitweise || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Limes]] || aktiv; Internal dauerhaft || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Messe]] || nur bei Messeeinsatz || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MiQua Guide ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MiQua Guide&#039;&#039;&#039; ist ein aktives Subprojekt von MiQua und kein eigenständiges Kundenprojekt. Es besitzt in der technischen Konfiguration den Schlüssel `miquaguide`. Der Guide kann die Stationen direkt ansprechen, ohne dass sich der Nutzer zuvor über einen Ticket-Monitor anmeldet.&lt;br /&gt;
== Inhalt einer Projektseite ==&lt;br /&gt;
&lt;br /&gt;
Jede Projektseite soll mindestens enthalten:&lt;br /&gt;
&lt;br /&gt;
* vollständiger Projektname und internes Kürzel&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* Domain von megbes-external&lt;br /&gt;
* DynDNS-Adresse oder interne Erreichbarkeit&lt;br /&gt;
* Container-Namen und Portzuordnungen&lt;br /&gt;
* installierte Releases&lt;br /&gt;
* eingesetzte Server- und Stationshardware&lt;br /&gt;
* projektspezifischer Stations-Timer&lt;br /&gt;
* Datum und Ergebnis der letzten Funktionsprüfung&lt;br /&gt;
* bekannte Besonderheiten und offene Aufgaben&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens und Schlüssel werden durch einen Verweis auf den Passwortmanager ersetzt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=LUX&amp;diff=107</id>
		<title>LUX</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=LUX&amp;diff=107"/>
		<updated>2026-08-07T13:50:13Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erwarteten Betrieb von megbes-internal dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= LUX – D’Lëtzebuerger Sprooch(en) =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Kunde / Träger&lt;br /&gt;
| Zenter fir d’Lëtzebuerger Sprooch&lt;br /&gt;
|-&lt;br /&gt;
| Ausstellung&lt;br /&gt;
| Wanderausstellung „D’Lëtzebuerger Sprooch(en)“&lt;br /&gt;
|-&lt;br /&gt;
| Interne Bezeichnungen&lt;br /&gt;
| LUX, Nowa Lux&lt;br /&gt;
|-&lt;br /&gt;
| Technischer Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;nowalux&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Projektstatus&lt;br /&gt;
| Wanderausstellung; nur zeitweise aufgebaut und in Betrieb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Wanderausstellung beschäftigt sich mit der luxemburgischen Sprache und ihrer Vielfalt. Nach der Projektreferenz von tinetronics umfasst sie annähernd 15 Stationen und setzt MegBes ein, damit Besucherinnen und Besucher Medienangebote mit dem eigenen Smartphone steuern können.&lt;br /&gt;
&lt;br /&gt;
Zu den beschriebenen Angeboten gehören Videostationen, deren Bild auf den Ausstellungsmonitoren und deren Ton auf dem eigenen Smartphone wiedergegeben wird, außerdem ein Quiz zu den luxemburgischen Sprachen und eine Dialektkarte. Medien- und Lichttechnik sind miteinander kombiniert.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-nowalux&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;34615&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Öffentliche MegBes-Adresse&lt;br /&gt;
| noch zu bestätigen&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| nur während Aufbau, Test und Betrieb an einem Ausstellungsort&lt;br /&gt;
|-&lt;br /&gt;
| Interner Server / DynDNS&lt;br /&gt;
| konkrete Angaben je Ausstellungsort noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Internal-Release&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Angaben zum Container stammen aus der [[Zentraler MegBes-Server – Inventur und Administration|Serverinventur]]. Die Portangabe beschreibt den internen Serverbetrieb und ist keine Aufforderung, den Port direkt öffentlich freizugeben.&lt;br /&gt;
&lt;br /&gt;
Da es sich um eine Wanderausstellung handelt, ist ein nicht erreichbares &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; außerhalb eines Ausstellungszeitraums nicht automatisch eine Störung. Für jeden neuen Aufbau müssen Standort, Laufzeit, lokales Netz und Funktionsprüfung neu dokumentiert werden.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* öffentliche Domain und vorgesehene Zugriffsart&lt;br /&gt;
* aktueller Ausstellungsort und geplanter Betriebszeitraum&lt;br /&gt;
* lokaler Server, DynDNS und Routerkonfiguration am jeweiligen Ausstellungsort&lt;br /&gt;
* vollständige Stationsliste und projektspezifischer Timer&lt;br /&gt;
* aktuelles Internal-Release&lt;br /&gt;
* Sicherungs- und Wiederherstellungsweg&lt;br /&gt;
* Datum und Ergebnis der nächsten vollständigen Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens, Schlüssel und vollständige DynDNS-Aktualisierungsadressen werden nicht auf dieser Seite gespeichert. Stattdessen wird auf den entsprechenden Eintrag im Passwortmanager verwiesen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Limes&amp;diff=106</id>
		<title>Limes</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Limes&amp;diff=106"/>
		<updated>2026-08-07T13:50:13Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erwarteten Betrieb von megbes-internal dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Limes =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Limes&amp;lt;/code&amp;gt; ist ein aktives MegBes-Projekt. Die eindeutige Zuordnung zu einer öffentlich beschriebenen Referenz auf tinetronics.de ist noch zu bestätigen; deshalb werden an dieser Stelle keine Museums- oder Ausstellungsangaben vermutet.&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;limes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-limes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32780&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; soll dauerhaft laufen&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| konkrete Angaben noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* vollständiger Name von Kunde, Einrichtung und Ausstellung&lt;br /&gt;
* zugehörige Referenz auf tinetronics.de&lt;br /&gt;
* MegBes-Funktionen, Ansprechpartner, Domain und Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS, Stationsliste und Timer&lt;br /&gt;
* Internal-Release und letzte vollständige Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=BayAM&amp;diff=105</id>
		<title>BayAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=BayAM&amp;diff=105"/>
		<updated>2026-08-07T13:50:13Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erwarteten Betrieb von megbes-internal dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= BayAM – Bayerisches Armeemuseum =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Kunde / Einrichtung&lt;br /&gt;
| Bayerisches Armeemuseum, Ingolstadt&lt;br /&gt;
|-&lt;br /&gt;
| Ausstellung&lt;br /&gt;
| Dauerausstellung „Krieg und Frieden – Militär in Bayern 1870–1914“&lt;br /&gt;
|-&lt;br /&gt;
| Interne Bezeichnung&lt;br /&gt;
| BayAM&lt;br /&gt;
|-&lt;br /&gt;
| Technischer Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;bayam&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Projektstatus&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MegBes wird beim Bayerischen Armeemuseum für die Dauerausstellung „Krieg und Frieden – Militär in Bayern 1870–1914“ eingesetzt. Die ebenfalls von tinetronics realisierte Medienstation „Sonne Mond &amp;amp; Sterne“ gehört zwar zu den Referenzen für das Bayerische Armeemuseum, ist jedoch nicht Gegenstand dieses MegBes-Projekts.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-bayam&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Nur lokal gebundener Host-Port &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Öffentliche MegBes-Adresse&lt;br /&gt;
| noch zu bestätigen&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; soll dauerhaft laufen&lt;br /&gt;
|-&lt;br /&gt;
| Interner Server / DynDNS&lt;br /&gt;
| konkrete Angaben noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Internal-Release&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Angaben zum Container stammen aus der [[Zentraler MegBes-Server – Inventur und Administration|Serverinventur]]. Der Host-Port ist nur an &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; gebunden und wird nicht direkt aus dem Internet angesprochen.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* genaue Rolle von MegBes innerhalb der Dauerausstellung und vorgesehene Zugriffsart&lt;br /&gt;
* öffentliche Domain&lt;br /&gt;
* lokaler Server, DynDNS und Routerkonfiguration&lt;br /&gt;
* Stationsliste und projektspezifischer Timer&lt;br /&gt;
* aktuelles Internal-Release&lt;br /&gt;
* Sicherungs- und Wiederherstellungsweg&lt;br /&gt;
* Datum und Ergebnis der nächsten vollständigen Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens, Schlüssel und vollständige DynDNS-Aktualisierungsadressen werden nicht auf dieser Seite gespeichert. Stattdessen wird auf den entsprechenden Eintrag im Passwortmanager verwiesen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=MiQua&amp;diff=104</id>
		<title>MiQua</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=MiQua&amp;diff=104"/>
		<updated>2026-08-07T13:50:13Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erwarteten Betrieb von megbes-internal dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MiQua – MiQua Showroom =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Einrichtung / Umfeld&lt;br /&gt;
| MiQua – LVR-Jüdisches Museum im Archäologischen Quartier Köln&lt;br /&gt;
|-&lt;br /&gt;
| Projektbezug&lt;br /&gt;
| MiQua Showroom&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;miqua&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der MiQua Showroom wird in den Referenzen von tinetronics im Zusammenhang mit der medientechnischen Unterstützung der LVR-Museen geführt. Der genaue fachliche und technische Einsatz von MegBes wird noch projektspezifisch ergänzt.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/projects_de.html tinetronics – weitere Projekte und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-miqua&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32779&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Zugehöriges Subprojekt&lt;br /&gt;
| [[Projektübersicht#MiQua Guide|MiQua Guide]], Projektschlüssel &amp;lt;code&amp;gt;miquaguide&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; soll dauerhaft laufen&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| konkrete Angaben noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* genaue MegBes-Funktionen und Abgrenzung zum MiQua Guide&lt;br /&gt;
* Ansprechpartner, Domain und Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS, Stationsliste und Timer&lt;br /&gt;
* Internal-Release und letzte vollständige Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=GSE&amp;diff=103</id>
		<title>GSE</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=GSE&amp;diff=103"/>
		<updated>2026-08-07T13:50:13Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erwarteten Betrieb von megbes-internal dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GSE – Gedenkstätte Esterwegen =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Einrichtung&lt;br /&gt;
| Landkreis Emsland, Gedenkstätte Esterwegen&lt;br /&gt;
|-&lt;br /&gt;
| Ausstellung&lt;br /&gt;
| Dauerausstellung „Die Emslandlager 1933–1945“&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;gse&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Dauerausstellung umfasst laut tinetronics-Referenz etwa 30 AV-Stationen mit zeitgenössischem Filmmaterial, Zeitzeugeninterviews und interaktiven Elementen. MegBes wurde während der Corona-Pandemie für eine kontaktarme Nutzung eingeführt. Besucherinnen und Besucher können Medieninstallationen mit dem eigenen Smartphone steuern und das zugehörige Audio synchron auf dem eigenen Gerät hören.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-gse&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32805&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; soll dauerhaft laufen&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| konkrete Angaben noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* Ansprechpartner, Domain und Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS und Routerkonfiguration&lt;br /&gt;
* vollständige Stationsliste und Timer&lt;br /&gt;
* Internal-Release sowie letzte vollständige Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=GKP&amp;diff=102</id>
		<title>GKP</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=GKP&amp;diff=102"/>
		<updated>2026-08-07T13:50:12Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erwarteten Betrieb von megbes-internal dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GKP – Garnisonkirche Potsdam =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Auftraggeber&lt;br /&gt;
| Stiftung Garnisonkirche Potsdam&lt;br /&gt;
|-&lt;br /&gt;
| Ausstellung&lt;br /&gt;
| Dauerausstellung „Glaube, Macht und Militär“&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;gkp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
tinetronics entwickelte und installierte für die Dauerausstellung maßgeschneiderte Medienstationen, die die Geschichte des Ortes interaktiv vermitteln. Der genaue Funktionsumfang von MegBes innerhalb dieser Ausstellung wird auf dieser Seite noch ergänzt.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-gkp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32769&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; soll dauerhaft laufen&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| konkrete Angaben noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* genaue MegBes-Funktionen, Ansprechpartner, Domain und Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS und Routerkonfiguration&lt;br /&gt;
* Stationsliste, Timer und Internal-Release&lt;br /&gt;
* Datum der letzten vollständigen Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=HON&amp;diff=101</id>
		<title>HON</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=HON&amp;diff=101"/>
		<updated>2026-08-07T13:50:12Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erwarteten Betrieb von megbes-internal dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HON – House of Noise =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HON&amp;lt;/code&amp;gt; ist eine private Test- und Spaßumgebung. Besucherinnen und Besucher des Twitch-Kanals von &#039;&#039;&#039;misstinamyte&#039;&#039;&#039; können über die Fernbedienung unter [https://houseofnoise.de/remote houseofnoise.de/remote] live ausgewählte Geräte im privaten Wohnzimmer steuern – darunter Projektionen, Nebel und Stroboskop-Effekte.&lt;br /&gt;
&lt;br /&gt;
Die Umgebung ist kein Kundenprojekt. Sie verbindet einen öffentlichen Zugriff mit realen Geräten in einem privaten Umfeld und muss deshalb besonders kontrolliert betrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Technischer Stand ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;hon&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-hon&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Nur lokal gebundener Host-Port &amp;lt;code&amp;gt;9997&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bedienoberfläche&lt;br /&gt;
| [https://houseofnoise.de/remote houseofnoise.de/remote]&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; soll dauerhaft laufen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Besondere Betriebsregeln ==&lt;br /&gt;
&lt;br /&gt;
* Die Steuerung darf nur die ausdrücklich vorgesehenen Geräte und Funktionen erreichen.&lt;br /&gt;
* Sicherheitskritische Effekte benötigen feste Laufzeitbegrenzungen und einen lokalen Abschaltweg.&lt;br /&gt;
* Nebel und Stroboskop werden nur unter persönlicher Aufsicht freigegeben.&lt;br /&gt;
* Die öffentliche Oberfläche darf keine privaten Netzwerk-, Geräte- oder Zugangsdaten offenlegen.&lt;br /&gt;
* Nach Ende eines Streams sollen nicht benötigte Steuerfunktionen deaktiviert werden.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* vollständige Liste der steuerbaren Geräte und Sicherheitsbegrenzungen&lt;br /&gt;
* Freigabe- und Abschaltablauf vor und nach einem Stream&lt;br /&gt;
* Daten des lokalen MegBes-Servers, Internal-Release und Erreichbarkeit&lt;br /&gt;
* projektspezifischer Timer und Missbrauchsschutz&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:Testumgebung]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Tine&amp;diff=100</id>
		<title>Tine</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Tine&amp;diff=100"/>
		<updated>2026-08-07T13:50:12Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erwarteten Betrieb von megbes-internal dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tine – interne MegBes-Testumgebung =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt; ist die interne Test- und Entwicklungsumgebung von tinetronics. Sie dient dazu, MegBes-Funktionen, Frontends und Schnittstellen zu prüfen, ohne ein Kundenprojekt zu beeinflussen. Die Umgebung ist kein Referenz- oder Produktivprojekt.&lt;br /&gt;
&lt;br /&gt;
== Technischer Stand ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-tine&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32770&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Öffentliche Testadresse&lt;br /&gt;
| &amp;lt;code&amp;gt;https://tine.megbes.de&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Erwarteter Internal-Betrieb&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; soll dauerhaft laufen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Umgebung kann bewusst von der Konfiguration produktiver Kundenprojekte abweichen. Testergebnisse müssen deshalb immer mit Datum, geprüftem Release und Versuchsaufbau dokumentiert werden.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* verantwortliche Personen und Freigaberegeln&lt;br /&gt;
* aktuell vorgesehene Testfälle&lt;br /&gt;
* Internal-Release und Daten des lokalen Testservers&lt;br /&gt;
* Regeln zum Bereinigen von Testdaten und temporären Zugängen&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:Testumgebung]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Projekt%C3%BCbersicht&amp;diff=99</id>
		<title>Projektübersicht</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Projekt%C3%BCbersicht&amp;diff=99"/>
		<updated>2026-08-07T13:42:55Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Weitere Projektseiten verlinkt, Umgebungsarten und Inventurstand ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projektübersicht =&lt;br /&gt;
&lt;br /&gt;
Alle nachfolgend aufgeführten Projekte sind aktiv. Technische Betriebsdaten werden schrittweise auf getrennten Projektseiten ergänzt. Geheimwerte werden niemals im Wiki gespeichert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Projekt&lt;br /&gt;
! Status&lt;br /&gt;
! Release external&lt;br /&gt;
! Release internal&lt;br /&gt;
! Letzte Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| [[Tine|tine]] || interne Testumgebung || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[HON]] || private Testumgebung || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[GSE]] || aktiv || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[MiQua]] || aktiv || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[BayAM]] || aktiv || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[GKP]] || aktiv || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[LUX]] || aktiv || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Limes]] || aktiv || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Messe]] || nur bei Messeeinsatz || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MiQua Guide ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MiQua Guide&#039;&#039;&#039; ist ein aktives Subprojekt von MiQua und kein eigenständiges Kundenprojekt. Es besitzt in der technischen Konfiguration den Schlüssel `miquaguide`. Der Guide kann die Stationen direkt ansprechen, ohne dass sich der Nutzer zuvor über einen Ticket-Monitor anmeldet.&lt;br /&gt;
== Inhalt einer Projektseite ==&lt;br /&gt;
&lt;br /&gt;
Jede Projektseite soll mindestens enthalten:&lt;br /&gt;
&lt;br /&gt;
* vollständiger Projektname und internes Kürzel&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* Domain von megbes-external&lt;br /&gt;
* DynDNS-Adresse oder interne Erreichbarkeit&lt;br /&gt;
* Container-Namen und Portzuordnungen&lt;br /&gt;
* installierte Releases&lt;br /&gt;
* eingesetzte Server- und Stationshardware&lt;br /&gt;
* projektspezifischer Stations-Timer&lt;br /&gt;
* Datum und Ergebnis der letzten Funktionsprüfung&lt;br /&gt;
* bekannte Besonderheiten und offene Aufgaben&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens und Schlüssel werden durch einen Verweis auf den Passwortmanager ersetzt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Limes&amp;diff=98</id>
		<title>Limes</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Limes&amp;diff=98"/>
		<updated>2026-08-07T13:42:55Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Projektseite mit Basis- und Inventurdaten angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Limes =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Limes&amp;lt;/code&amp;gt; ist ein aktives MegBes-Projekt. Die eindeutige Zuordnung zu einer öffentlich beschriebenen Referenz auf tinetronics.de ist noch zu bestätigen; deshalb werden an dieser Stelle keine Museums- oder Ausstellungsangaben vermutet.&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;limes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-limes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32780&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* vollständiger Name von Kunde, Einrichtung und Ausstellung&lt;br /&gt;
* zugehörige Referenz auf tinetronics.de&lt;br /&gt;
* MegBes-Funktionen, Ansprechpartner, Domain und Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS, Stationsliste und Timer&lt;br /&gt;
* Internal-Release und letzte vollständige Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=MiQua&amp;diff=97</id>
		<title>MiQua</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=MiQua&amp;diff=97"/>
		<updated>2026-08-07T13:42:55Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Projektseite mit Basis- und Inventurdaten angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MiQua – MiQua Showroom =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Einrichtung / Umfeld&lt;br /&gt;
| MiQua – LVR-Jüdisches Museum im Archäologischen Quartier Köln&lt;br /&gt;
|-&lt;br /&gt;
| Projektbezug&lt;br /&gt;
| MiQua Showroom&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;miqua&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der MiQua Showroom wird in den Referenzen von tinetronics im Zusammenhang mit der medientechnischen Unterstützung der LVR-Museen geführt. Der genaue fachliche und technische Einsatz von MegBes wird noch projektspezifisch ergänzt.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/projects_de.html tinetronics – weitere Projekte und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-miqua&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32779&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Zugehöriges Subprojekt&lt;br /&gt;
| [[Projektübersicht#MiQua Guide|MiQua Guide]], Projektschlüssel &amp;lt;code&amp;gt;miquaguide&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* genaue MegBes-Funktionen und Abgrenzung zum MiQua Guide&lt;br /&gt;
* Ansprechpartner, Domain und Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS, Stationsliste und Timer&lt;br /&gt;
* Internal-Release und letzte vollständige Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=GKP&amp;diff=96</id>
		<title>GKP</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=GKP&amp;diff=96"/>
		<updated>2026-08-07T13:42:55Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Projektseite mit Basis- und Inventurdaten angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GKP – Garnisonkirche Potsdam =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Auftraggeber&lt;br /&gt;
| Stiftung Garnisonkirche Potsdam&lt;br /&gt;
|-&lt;br /&gt;
| Ausstellung&lt;br /&gt;
| Dauerausstellung „Glaube, Macht und Militär“&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;gkp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
tinetronics entwickelte und installierte für die Dauerausstellung maßgeschneiderte Medienstationen, die die Geschichte des Ortes interaktiv vermitteln. Der genaue Funktionsumfang von MegBes innerhalb dieser Ausstellung wird auf dieser Seite noch ergänzt.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-gkp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32769&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* genaue MegBes-Funktionen, Ansprechpartner, Domain und Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS und Routerkonfiguration&lt;br /&gt;
* Stationsliste, Timer und Internal-Release&lt;br /&gt;
* Datum der letzten vollständigen Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=GSE&amp;diff=95</id>
		<title>GSE</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=GSE&amp;diff=95"/>
		<updated>2026-08-07T13:42:55Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Projektseite mit Basis- und Inventurdaten angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GSE – Gedenkstätte Esterwegen =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Einrichtung&lt;br /&gt;
| Landkreis Emsland, Gedenkstätte Esterwegen&lt;br /&gt;
|-&lt;br /&gt;
| Ausstellung&lt;br /&gt;
| Dauerausstellung „Die Emslandlager 1933–1945“&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;gse&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Status&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Dauerausstellung umfasst laut tinetronics-Referenz etwa 30 AV-Stationen mit zeitgenössischem Filmmaterial, Zeitzeugeninterviews und interaktiven Elementen. MegBes wurde während der Corona-Pandemie für eine kontaktarme Nutzung eingeführt. Besucherinnen und Besucher können Medieninstallationen mit dem eigenen Smartphone steuern und das zugehörige Audio synchron auf dem eigenen Gerät hören.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-gse&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32805&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Domain, Internal-Release und Standortdaten&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* Ansprechpartner, Domain und Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS und Routerkonfiguration&lt;br /&gt;
* vollständige Stationsliste und Timer&lt;br /&gt;
* Internal-Release sowie letzte vollständige Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Messe&amp;diff=94</id>
		<title>Messe</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Messe&amp;diff=94"/>
		<updated>2026-08-07T13:42:55Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Projektseite mit Basis- und Inventurdaten angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Messe – MegBes am Messestand =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
Das Projekt &amp;lt;code&amp;gt;messe&amp;lt;/code&amp;gt; wird nur aktiviert, wenn tinetronics den eigenen Messestand mit MegBes-Funktionen betreibt. Außerhalb eines Messebetriebs ist die Umgebung nicht als dauerhaft aktives Produktivsystem zu behandeln.&lt;br /&gt;
&lt;br /&gt;
Auf der Projektseite werden je Einsatz die Veranstaltung, der Aufbau und die tatsächlich verwendeten Funktionen dokumentiert. Dadurch bleibt nachvollziehbar, ob die vorhandene Konfiguration zum nächsten Messestand passt oder vorab angepasst werden muss.&lt;br /&gt;
&lt;br /&gt;
== Technischer Stand ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;messe&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-messe&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32771&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Betriebsstatus&lt;br /&gt;
| nur bei einem konkreten Messeeinsatz aktiv&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Checkliste je Messeeinsatz ==&lt;br /&gt;
&lt;br /&gt;
* Veranstaltung, Ort und Zeitraum eintragen&lt;br /&gt;
* geplante MegBes-Funktionen festlegen&lt;br /&gt;
* Stations- und Geräteliste für den konkreten Aufbau erstellen&lt;br /&gt;
* Internetzugang und lokales Messe-Netz vorab klären&lt;br /&gt;
* Releases und Funktion vor dem Versand testen&lt;br /&gt;
* Auf- und Abbauverantwortliche benennen&lt;br /&gt;
* nach der Messe temporäre Zugänge deaktivieren und Ergebnis dokumentieren&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=HON&amp;diff=93</id>
		<title>HON</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=HON&amp;diff=93"/>
		<updated>2026-08-07T13:42:55Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Projektseite mit Basis- und Inventurdaten angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HON – House of Noise =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HON&amp;lt;/code&amp;gt; ist eine private Test- und Spaßumgebung. Besucherinnen und Besucher des Twitch-Kanals von &#039;&#039;&#039;misstinamyte&#039;&#039;&#039; können über die Fernbedienung unter [https://houseofnoise.de/remote houseofnoise.de/remote] live ausgewählte Geräte im privaten Wohnzimmer steuern – darunter Projektionen, Nebel und Stroboskop-Effekte.&lt;br /&gt;
&lt;br /&gt;
Die Umgebung ist kein Kundenprojekt. Sie verbindet einen öffentlichen Zugriff mit realen Geräten in einem privaten Umfeld und muss deshalb besonders kontrolliert betrieben werden.&lt;br /&gt;
&lt;br /&gt;
== Technischer Stand ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;hon&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-hon&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Nur lokal gebundener Host-Port &amp;lt;code&amp;gt;9997&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bedienoberfläche&lt;br /&gt;
| [https://houseofnoise.de/remote houseofnoise.de/remote]&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Besondere Betriebsregeln ==&lt;br /&gt;
&lt;br /&gt;
* Die Steuerung darf nur die ausdrücklich vorgesehenen Geräte und Funktionen erreichen.&lt;br /&gt;
* Sicherheitskritische Effekte benötigen feste Laufzeitbegrenzungen und einen lokalen Abschaltweg.&lt;br /&gt;
* Nebel und Stroboskop werden nur unter persönlicher Aufsicht freigegeben.&lt;br /&gt;
* Die öffentliche Oberfläche darf keine privaten Netzwerk-, Geräte- oder Zugangsdaten offenlegen.&lt;br /&gt;
* Nach Ende eines Streams sollen nicht benötigte Steuerfunktionen deaktiviert werden.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* vollständige Liste der steuerbaren Geräte und Sicherheitsbegrenzungen&lt;br /&gt;
* Freigabe- und Abschaltablauf vor und nach einem Stream&lt;br /&gt;
* lokaler MegBes-Server, Internal-Release und Erreichbarkeit&lt;br /&gt;
* projektspezifischer Timer und Missbrauchsschutz&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:Testumgebung]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Tine&amp;diff=92</id>
		<title>Tine</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Tine&amp;diff=92"/>
		<updated>2026-08-07T13:42:55Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Projektseite mit Basis- und Inventurdaten angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tine – interne MegBes-Testumgebung =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt; ist die interne Test- und Entwicklungsumgebung von tinetronics. Sie dient dazu, MegBes-Funktionen, Frontends und Schnittstellen zu prüfen, ohne ein Kundenprojekt zu beeinflussen. Die Umgebung ist kein Referenz- oder Produktivprojekt.&lt;br /&gt;
&lt;br /&gt;
== Technischer Stand ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-tine&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;32770&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Öffentliche Testadresse&lt;br /&gt;
| &amp;lt;code&amp;gt;https://tine.megbes.de&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Umgebung kann bewusst von der Konfiguration produktiver Kundenprojekte abweichen. Testergebnisse müssen deshalb immer mit Datum, geprüftem Release und Versuchsaufbau dokumentiert werden.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* verantwortliche Personen und Freigaberegeln&lt;br /&gt;
* aktuell vorgesehene Testfälle&lt;br /&gt;
* Internal-Release und gegebenenfalls lokaler Testserver&lt;br /&gt;
* Regeln zum Bereinigen von Testdaten und temporären Zugängen&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:Testumgebung]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=BayAM&amp;diff=91</id>
		<title>BayAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=BayAM&amp;diff=91"/>
		<updated>2026-08-07T13:32:55Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: MegBes korrekt der Dauerausstellung Krieg und Frieden zugeordnet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= BayAM – Bayerisches Armeemuseum =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Kunde / Einrichtung&lt;br /&gt;
| Bayerisches Armeemuseum, Ingolstadt&lt;br /&gt;
|-&lt;br /&gt;
| Ausstellung&lt;br /&gt;
| Dauerausstellung „Krieg und Frieden – Militär in Bayern 1870–1914“&lt;br /&gt;
|-&lt;br /&gt;
| Interne Bezeichnung&lt;br /&gt;
| BayAM&lt;br /&gt;
|-&lt;br /&gt;
| Technischer Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;bayam&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Projektstatus&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MegBes wird beim Bayerischen Armeemuseum für die Dauerausstellung „Krieg und Frieden – Militär in Bayern 1870–1914“ eingesetzt. Die ebenfalls von tinetronics realisierte Medienstation „Sonne Mond &amp;amp; Sterne“ gehört zwar zu den Referenzen für das Bayerische Armeemuseum, ist jedoch nicht Gegenstand dieses MegBes-Projekts.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-bayam&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Nur lokal gebundener Host-Port &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Öffentliche MegBes-Adresse&lt;br /&gt;
| noch zu bestätigen&lt;br /&gt;
|-&lt;br /&gt;
| Interner Server / DynDNS&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Internal-Release&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Angaben zum Container stammen aus der [[Zentraler MegBes-Server – Inventur und Administration|Serverinventur]]. Der Host-Port ist nur an &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; gebunden und wird nicht direkt aus dem Internet angesprochen.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* genaue Rolle von MegBes innerhalb der Dauerausstellung und vorgesehene Zugriffsart&lt;br /&gt;
* öffentliche Domain&lt;br /&gt;
* lokaler Server, DynDNS und Routerkonfiguration&lt;br /&gt;
* Stationsliste und projektspezifischer Timer&lt;br /&gt;
* aktuelles Internal-Release&lt;br /&gt;
* Sicherungs- und Wiederherstellungsweg&lt;br /&gt;
* Datum und Ergebnis der nächsten vollständigen Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens, Schlüssel und vollständige DynDNS-Aktualisierungsadressen werden nicht auf dieser Seite gespeichert. Stattdessen wird auf den entsprechenden Eintrag im Passwortmanager verwiesen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Projekt%C3%BCbersicht&amp;diff=90</id>
		<title>Projektübersicht</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Projekt%C3%BCbersicht&amp;diff=90"/>
		<updated>2026-08-07T13:28:57Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: LUX und BayAM mit neuen Projektseiten verlinkt und Inventurstand ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projektübersicht =&lt;br /&gt;
&lt;br /&gt;
Alle nachfolgend aufgeführten Projekte sind aktiv. Technische Betriebsdaten werden schrittweise auf getrennten Projektseiten ergänzt. Geheimwerte werden niemals im Wiki gespeichert.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Projekt&lt;br /&gt;
! Status&lt;br /&gt;
! Release external&lt;br /&gt;
! Release internal&lt;br /&gt;
! Letzte Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| tine || aktiv || noch zu erfassen || noch zu erfassen || noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| HON || aktiv || noch zu erfassen || noch zu erfassen || noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| GSE || aktiv || noch zu erfassen || noch zu erfassen || noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| MiQua || aktiv || noch zu erfassen || noch zu erfassen || noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| [[BayAM]] || aktiv || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| GKP || aktiv || noch zu erfassen || noch zu erfassen || noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| [[LUX]] || aktiv || &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt; || noch zu erfassen || 7. August 2026&lt;br /&gt;
|-&lt;br /&gt;
| Limes || aktiv || noch zu erfassen || noch zu erfassen || noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Messe || aktiv || noch zu erfassen || noch zu erfassen || noch zu erfassen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MiQua Guide ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MiQua Guide&#039;&#039;&#039; ist ein aktives Subprojekt von MiQua und kein eigenständiges Kundenprojekt. Es besitzt in der technischen Konfiguration den Schlüssel `miquaguide`. Der Guide kann die Stationen direkt ansprechen, ohne dass sich der Nutzer zuvor über einen Ticket-Monitor anmeldet.&lt;br /&gt;
== Inhalt einer Projektseite ==&lt;br /&gt;
&lt;br /&gt;
Jede Projektseite soll mindestens enthalten:&lt;br /&gt;
&lt;br /&gt;
* vollständiger Projektname und internes Kürzel&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* Domain von megbes-external&lt;br /&gt;
* DynDNS-Adresse oder interne Erreichbarkeit&lt;br /&gt;
* Container-Namen und Portzuordnungen&lt;br /&gt;
* installierte Releases&lt;br /&gt;
* eingesetzte Server- und Stationshardware&lt;br /&gt;
* projektspezifischer Stations-Timer&lt;br /&gt;
* Datum und Ergebnis der letzten Funktionsprüfung&lt;br /&gt;
* bekannte Besonderheiten und offene Aufgaben&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens und Schlüssel werden durch einen Verweis auf den Passwortmanager ersetzt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=BayAM&amp;diff=89</id>
		<title>BayAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=BayAM&amp;diff=89"/>
		<updated>2026-08-07T13:28:57Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Projektseite mit Referenz- und Inventur-Basisdaten angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= BayAM – Bayerisches Armeemuseum =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Kunde / Einrichtung&lt;br /&gt;
| Bayerisches Armeemuseum, Ingolstadt&lt;br /&gt;
|-&lt;br /&gt;
| Medienstation&lt;br /&gt;
| „Sonne Mond &amp;amp; Sterne“&lt;br /&gt;
|-&lt;br /&gt;
| Interne Bezeichnung&lt;br /&gt;
| BayAM&lt;br /&gt;
|-&lt;br /&gt;
| Technischer Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;bayam&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Projektstatus&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
tinetronics entwickelte und produzierte die Medienstation „Sonne Mond &amp;amp; Sterne“ für die Dauerausstellung des Bayerischen Armeemuseums in Ingolstadt. Sie vermittelt astronomische Phänomene und deren Bedeutung für militärische Navigation und Strategie. Historische Inhalte werden dabei mit moderner Medientechnik verbunden.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-bayam&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Nur lokal gebundener Host-Port &amp;lt;code&amp;gt;32768&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Öffentliche MegBes-Adresse&lt;br /&gt;
| noch zu bestätigen&lt;br /&gt;
|-&lt;br /&gt;
| Interner Server / DynDNS&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Internal-Release&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Angaben zum Container stammen aus der [[Zentraler MegBes-Server – Inventur und Administration|Serverinventur]]. Der Host-Port ist nur an &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; gebunden und wird nicht direkt aus dem Internet angesprochen.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* Rolle von MegBes innerhalb der Medienstation und vorgesehene Zugriffsart&lt;br /&gt;
* öffentliche Domain&lt;br /&gt;
* lokaler Server, DynDNS und Routerkonfiguration&lt;br /&gt;
* Stationsliste und projektspezifischer Timer&lt;br /&gt;
* aktuelles Internal-Release&lt;br /&gt;
* Sicherungs- und Wiederherstellungsweg&lt;br /&gt;
* Datum und Ergebnis der nächsten vollständigen Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens, Schlüssel und vollständige DynDNS-Aktualisierungsadressen werden nicht auf dieser Seite gespeichert. Stattdessen wird auf den entsprechenden Eintrag im Passwortmanager verwiesen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=LUX&amp;diff=88</id>
		<title>LUX</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=LUX&amp;diff=88"/>
		<updated>2026-08-07T13:28:57Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Projektseite mit Referenz- und Inventur-Basisdaten angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= LUX – D’Lëtzebuerger Sprooch(en) =&lt;br /&gt;
&lt;br /&gt;
== Projektüberblick ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Stand&lt;br /&gt;
|-&lt;br /&gt;
| Kunde / Träger&lt;br /&gt;
| Zenter fir d’Lëtzebuerger Sprooch&lt;br /&gt;
|-&lt;br /&gt;
| Ausstellung&lt;br /&gt;
| Wanderausstellung „D’Lëtzebuerger Sprooch(en)“&lt;br /&gt;
|-&lt;br /&gt;
| Interne Bezeichnungen&lt;br /&gt;
| LUX, Nowa Lux&lt;br /&gt;
|-&lt;br /&gt;
| Technischer Projektschlüssel&lt;br /&gt;
| &amp;lt;code&amp;gt;nowalux&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Projektstatus&lt;br /&gt;
| aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Wanderausstellung beschäftigt sich mit der luxemburgischen Sprache und ihrer Vielfalt. Nach der Projektreferenz von tinetronics umfasst sie annähernd 15 Stationen und setzt MegBes ein, damit Besucherinnen und Besucher Medienangebote mit dem eigenen Smartphone steuern können.&lt;br /&gt;
&lt;br /&gt;
Zu den beschriebenen Angeboten gehören Videostationen, deren Bild auf den Ausstellungsmonitoren und deren Ton auf dem eigenen Smartphone wiedergegeben wird, außerdem ein Quiz zu den luxemburgischen Sprachen und eine Dialektkarte. Medien- und Lichttechnik sind miteinander kombiniert.&lt;br /&gt;
&lt;br /&gt;
Quelle: [https://www.tinetronics.de/index_de.html tinetronics – Projektübersicht und Referenzen]&lt;br /&gt;
&lt;br /&gt;
== MegBes-Betrieb ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Aktueller Stand&lt;br /&gt;
|-&lt;br /&gt;
| Externer Container&lt;br /&gt;
| &amp;lt;code&amp;gt;megbes-external-nowalux&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| External-Release&lt;br /&gt;
| &amp;lt;code&amp;gt;MARCH-2026-1-RELEASE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Container-Port&lt;br /&gt;
| Host-Port &amp;lt;code&amp;gt;34615&amp;lt;/code&amp;gt; auf Container-Port &amp;lt;code&amp;gt;8080&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Öffentliche MegBes-Adresse&lt;br /&gt;
| noch zu bestätigen&lt;br /&gt;
|-&lt;br /&gt;
| Interner Server / DynDNS&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Internal-Release&lt;br /&gt;
| noch zu erfassen&lt;br /&gt;
|-&lt;br /&gt;
| Letzte technische Inventur&lt;br /&gt;
| 7. August 2026 – externer Container lief&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Angaben zum Container stammen aus der [[Zentraler MegBes-Server – Inventur und Administration|Serverinventur]]. Die Portangabe beschreibt den internen Serverbetrieb und ist keine Aufforderung, den Port direkt öffentlich freizugeben.&lt;br /&gt;
&lt;br /&gt;
== Noch zu ergänzen ==&lt;br /&gt;
&lt;br /&gt;
* verantwortliche Ansprechpartner innerhalb von tinetronics&lt;br /&gt;
* öffentliche Domain und vorgesehene Zugriffsart&lt;br /&gt;
* lokaler Server, DynDNS und Routerkonfiguration&lt;br /&gt;
* vollständige Stationsliste und projektspezifischer Timer&lt;br /&gt;
* aktuelles Internal-Release&lt;br /&gt;
* Sicherungs- und Wiederherstellungsweg&lt;br /&gt;
* Datum und Ergebnis der nächsten vollständigen Funktionsprüfung&lt;br /&gt;
&lt;br /&gt;
Zugangsdaten, Tokens, Schlüssel und vollständige DynDNS-Aktualisierungsadressen werden nicht auf dieser Seite gespeichert. Stattdessen wird auf den entsprechenden Eintrag im Passwortmanager verwiesen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Projekte]]&lt;br /&gt;
[[Kategorie:MegBes]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Neukunde&amp;diff=87</id>
		<title>Neukunde</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Neukunde&amp;diff=87"/>
		<updated>2026-08-07T13:19:47Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Seite als geführten, praxisnahen Ablauf für neue Projekte überarbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Neukunde / neues Projekt =&lt;br /&gt;
&lt;br /&gt;
Diese Seite ist der rote Faden für die Einrichtung eines neuen MegBes-Projekts. Sie führt von den ersten Angaben bis zur Übergabe. Technische Einzelheiten stehen auf den jeweils verlinkten Fachseiten – hier geht es vor allem darum, &#039;&#039;&#039;was als Nächstes zu tun ist&#039;&#039;&#039; und woran du erkennst, dass eine Etappe abgeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Nicht jedes Projekt benötigt alle hier genannten Bausteine. Wenn beispielsweise kein lokaler MegBes-Server vorgesehen ist, können die entsprechenden Schritte übersprungen werden.&lt;br /&gt;
&lt;br /&gt;
== Der Weg zum fertigen Projekt ==&lt;br /&gt;
&lt;br /&gt;
# Projekt und Ansprechpartner erfassen&lt;br /&gt;
# Betriebsart und benötigte Komponenten festlegen&lt;br /&gt;
# Öffentliche MegBes-Seite bereitstellen&lt;br /&gt;
# Technik am Standort vorbereiten&lt;br /&gt;
# Stationen anbinden&lt;br /&gt;
# Gesamtsystem abnehmen und dokumentieren&lt;br /&gt;
&lt;br /&gt;
== 1. Projekt beginnen ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ziel dieser Etappe:&#039;&#039;&#039; Alle Beteiligten sprechen über dasselbe Projekt, und die wichtigsten Ansprechpartner sind bekannt.&lt;br /&gt;
&lt;br /&gt;
Lege zunächst in der [[Projektübersicht]] eine eigene Projektseite an. Verwende dafür den Namen, unter dem das Projekt später auch intern wiedergefunden werden soll.&lt;br /&gt;
&lt;br /&gt;
Auf der Projektseite sollten mindestens diese Angaben stehen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Beispiel oder Erläuterung&lt;br /&gt;
|-&lt;br /&gt;
| Kunde und Projektname&lt;br /&gt;
| Museum Beispielstadt – Dauerausstellung&lt;br /&gt;
|-&lt;br /&gt;
| Technischer Projektschlüssel&lt;br /&gt;
| Kurzer, eindeutiger Name ohne Leerzeichen, z. B. &amp;lt;code&amp;gt;beispielstadt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Zuständige Personen&lt;br /&gt;
| Projektleitung, technische Betreuung und Ansprechpartner vor Ort&lt;br /&gt;
|-&lt;br /&gt;
| Geplanter Betriebsbeginn&lt;br /&gt;
| Eröffnung, Testbetrieb oder Übergabetermin&lt;br /&gt;
|-&lt;br /&gt;
| Anzahl der Stationen&lt;br /&gt;
| Einschließlich Reserve- oder Teststationen&lt;br /&gt;
|-&lt;br /&gt;
| Aktueller Stand&lt;br /&gt;
| Planung, Einrichtung, Test oder Betrieb&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der technische Projektschlüssel wird später unter anderem für Container, Konfigurationsdateien und Adressen verwendet. Er sollte deshalb früh festgelegt und danach nicht mehr geändert werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiter, wenn …&#039;&#039;&#039; eine Projektseite vorhanden ist, der Projektschlüssel feststeht und mindestens je ein organisatorischer und technischer Ansprechpartner bekannt ist.&lt;br /&gt;
&lt;br /&gt;
== 2. Gemeinsam festlegen, wie das Projekt funktionieren soll ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ziel dieser Etappe:&#039;&#039;&#039; Die grundlegenden Entscheidungen sind getroffen, bevor Server oder Container eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
=== Was sollen Besucherinnen und Besucher sehen? ===&lt;br /&gt;
&lt;br /&gt;
Kläre, welche Informationen auf der MegBes-Seite erscheinen sollen, zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
* aktuelle Verfügbarkeit oder Zustände der Stationen,&lt;br /&gt;
* Hinweise zu einzelnen Angeboten,&lt;br /&gt;
* eine für das Projekt gestaltete Oberfläche,&lt;br /&gt;
* mehrere Sprachen.&lt;br /&gt;
&lt;br /&gt;
Halte Gestaltungswünsche, Sprachen und besondere Inhalte auf der Projektseite fest.&lt;br /&gt;
&lt;br /&gt;
=== Wie wird die Seite aufgerufen? ===&lt;br /&gt;
&lt;br /&gt;
Entscheide zwischen den üblichen Betriebsarten:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Direkter Zugriff:&#039;&#039;&#039; Die Seite ist ohne vorherige Prüfung erreichbar.&lt;br /&gt;
* &#039;&#039;&#039;Zugriff über Ticket-Monitor:&#039;&#039;&#039; Der Aufruf wird anhand der vorgesehenen Berechtigung freigegeben.&lt;br /&gt;
&lt;br /&gt;
Eine verständliche Gegenüberstellung steht unter [[Bedienung und Authentifizierung]].&lt;br /&gt;
&lt;br /&gt;
=== Welche Technik wird benötigt? ===&lt;br /&gt;
&lt;br /&gt;
Prüfe gemeinsam mit der technischen Betreuung:&lt;br /&gt;
&lt;br /&gt;
* Wird nur die öffentliche MegBes-Seite benötigt?&lt;br /&gt;
* Gibt es vor Ort einen lokalen MegBes-Server?&lt;br /&gt;
* Wie melden die Stationen ihren Zustand – insbesondere per UDP oder über einen anderen vorgesehenen Weg?&lt;br /&gt;
* Wird für den Standort DynDNS oder eine feste öffentliche Adresse benötigt?&lt;br /&gt;
* Wer kann Änderungen an Router, Firewall und Standortnetz freigeben?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiter, wenn …&#039;&#039;&#039; Betriebsart, benötigte Komponenten, Stationenzahl und Verantwortlichkeiten für das Standortnetz feststehen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Noch nicht weitermachen, wenn …&#039;&#039;&#039; unklar ist, ob ein lokaler Server benötigt wird oder wer Router- und Firewall-Änderungen genehmigen darf. Diese Entscheidungen beeinflussen den gesamten weiteren Aufbau.&lt;br /&gt;
&lt;br /&gt;
== 3. Die öffentliche Seite vorbereiten ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ziel dieser Etappe:&#039;&#039;&#039; Das Projekt ist über seine spätere öffentliche Adresse erreichbar und zeigt die richtige Konfiguration.&lt;br /&gt;
&lt;br /&gt;
Gehe in dieser Reihenfolge vor:&lt;br /&gt;
&lt;br /&gt;
# Lege die gewünschte Adresse fest, normalerweise &amp;lt;code&amp;gt;&amp;amp;lt;projekt&amp;amp;gt;.megbes.de&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Erstelle die Projektkonfiguration im Repository &amp;lt;code&amp;gt;tinetronics/megbes-config&amp;lt;/code&amp;gt;. Die benötigten Felder sind unter [[Konfiguration]] beschrieben.&lt;br /&gt;
# Stelle unter Plesk einen eigenen &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt;-Container für das Projekt bereit. Die technische Anleitung steht unter [[Megbes-external unter Plesk]].&lt;br /&gt;
# Verknüpfe Domain, Zertifikat und Container.&lt;br /&gt;
# Öffne die Adresse im Browser und kontrolliere Inhalt, Gestaltung und Verhalten.&lt;br /&gt;
&lt;br /&gt;
Verwende grundsätzlich eine freigegebene Release-Version. Zugangsdaten, Tokens, private Schlüssel und vollständige DynDNS-Aktualisierungsadressen gehören &#039;&#039;&#039;nicht&#039;&#039;&#039; ins Wiki oder in die Projektkonfiguration, sondern in den vorgesehenen Passwortmanager.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiter, wenn …&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* die öffentliche Adresse per HTTPS ohne Zertifikatswarnung erreichbar ist,&lt;br /&gt;
* die richtige Projektoberfläche erscheint,&lt;br /&gt;
* die vereinbarte Zugriffsart funktioniert,&lt;br /&gt;
* keine Zugangsdaten in Wiki, Repository oder Containerbeschreibung abgelegt wurden.&lt;br /&gt;
&lt;br /&gt;
== 4. Den Standort vorbereiten ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ziel dieser Etappe:&#039;&#039;&#039; Der lokale MegBes-Server ist zuverlässig erreichbar und kann mit den Stationen sowie der öffentlichen Seite kommunizieren.&lt;br /&gt;
&lt;br /&gt;
Dieser Abschnitt entfällt, wenn das Projekt keinen lokalen MegBes-Server benötigt.&lt;br /&gt;
&lt;br /&gt;
=== Vor dem Aufbau klären ===&lt;br /&gt;
&lt;br /&gt;
Besorge oder bestätige zunächst:&lt;br /&gt;
&lt;br /&gt;
* Standort und Hardware des Servers,&lt;br /&gt;
* feste interne IP-Adresse,&lt;br /&gt;
* DNS- und Gateway-Angaben,&lt;br /&gt;
* Zugang zum Router beziehungsweise eine zuständige Kontaktperson,&lt;br /&gt;
* DynDNS-Name, falls erforderlich,&lt;br /&gt;
* Liste der Stationen mit Namen und IP-Adressen,&lt;br /&gt;
* geplante Sicherung und verantwortliche Person.&lt;br /&gt;
&lt;br /&gt;
=== Server in sinnvollen Etappen einrichten ===&lt;br /&gt;
&lt;br /&gt;
# Ubuntu installieren und aktualisieren: [[Ubuntu installieren]] und [[Ubuntu aktualisieren]]&lt;br /&gt;
# Eine feste interne Adresse einrichten: [[Feste IP-Adresse unter Ubuntu]]&lt;br /&gt;
# Docker installieren und prüfen: [[Docker installieren]]&lt;br /&gt;
# &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; mit der Projektkonfiguration starten: [[Megbes-internal]]&lt;br /&gt;
# Router, DynDNS und erforderliche Weiterleitungen einrichten: [[DynDNS und Router]]&lt;br /&gt;
# Zertifikate einrichten oder übertragen: [[Zertifikate]]&lt;br /&gt;
&lt;br /&gt;
Führe nach jeder Etappe einen kurzen Funktionstest durch. So ist bei einem Fehler sofort klar, in welchem Abschnitt er entstanden ist.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiter, wenn …&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* der Server nach einem Neustart wieder erreichbar ist,&lt;br /&gt;
* der interne Container selbstständig startet,&lt;br /&gt;
* die Projektkonfiguration geladen wird,&lt;br /&gt;
* die benötigte Verbindung zwischen Standort und öffentlicher Seite funktioniert,&lt;br /&gt;
* keine unnötigen Dienste oder Ports aus dem Internet erreichbar sind.&lt;br /&gt;
&lt;br /&gt;
== 5. Stationen Schritt für Schritt anbinden ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ziel dieser Etappe:&#039;&#039;&#039; Jede Station erscheint eindeutig und mit dem richtigen Zustand im System.&lt;br /&gt;
&lt;br /&gt;
Beginne nicht sofort mit allen Stationen. Nimm zuerst eine gut erreichbare Teststation:&lt;br /&gt;
&lt;br /&gt;
# Vergib oder bestätige Namen und IP-Adresse der Station.&lt;br /&gt;
# Trage sie in der Projektkonfiguration ein.&lt;br /&gt;
# Richte die vorgesehene Zustandsmeldung ein.&lt;br /&gt;
# Prüfe den Signalweg vom Gerät bis zur Anzeige. Hilfestellung: [[UDP und Stationszustände]] und [[Routing und Signalweg]].&lt;br /&gt;
# Simuliere mindestens einen Zustandswechsel und kontrolliere die Anzeige.&lt;br /&gt;
&lt;br /&gt;
Wenn die Teststation zuverlässig funktioniert, übertrage das Vorgehen auf die übrigen Stationen. Arbeite die Stationsliste einzeln ab und markiere jede geprüfte Station auf der Projektseite.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Weiter, wenn …&#039;&#039;&#039; jede Station eindeutig zugeordnet ist, Zustandsänderungen korrekt erscheinen und ein Neustart der Station beziehungsweise des lokalen Servers erfolgreich getestet wurde.&lt;br /&gt;
&lt;br /&gt;
== 6. Gemeinsame Abnahme ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ziel dieser Etappe:&#039;&#039;&#039; Das System funktioniert nicht nur technisch, sondern auch im vorgesehenen Arbeitsalltag.&lt;br /&gt;
&lt;br /&gt;
Führe die Abnahme möglichst gemeinsam mit einer verantwortlichen Person des Projekts durch.&lt;br /&gt;
&lt;br /&gt;
=== Besucheransicht ===&lt;br /&gt;
&lt;br /&gt;
* Öffnet sich die richtige Seite auf Smartphone und einem normalen Rechner?&lt;br /&gt;
* Sind Texte, Logos, Farben und Sprachen korrekt?&lt;br /&gt;
* Ist die Bedienung verständlich?&lt;br /&gt;
* Funktioniert die vereinbarte Zugriffsart?&lt;br /&gt;
&lt;br /&gt;
=== Technischer Betrieb ===&lt;br /&gt;
&lt;br /&gt;
* Werden alle Stationen mit dem richtigen Namen und Zustand angezeigt?&lt;br /&gt;
* Werden Ausfall, Rückkehr und Neustart einer Teststation korrekt erkannt?&lt;br /&gt;
* Starten Server und Container nach einem Neustart automatisch?&lt;br /&gt;
* Sind HTTPS und Zertifikatskette fehlerfrei?&lt;br /&gt;
* Sind nur die tatsächlich benötigten Ports erreichbar?&lt;br /&gt;
&lt;br /&gt;
=== Betrieb und Wiederherstellung ===&lt;br /&gt;
&lt;br /&gt;
* Ist festgelegt, wer Störungen zuerst prüft?&lt;br /&gt;
* Sind Sicherung und Wiederherstellung beschrieben und mindestens einmal geprüft?&lt;br /&gt;
* Sind Zugangsdaten vollständig im Passwortmanager hinterlegt?&lt;br /&gt;
* Ist die eingesetzte Release-Version dokumentiert?&lt;br /&gt;
&lt;br /&gt;
Für den späteren Betrieb dient [[Wartung, Backups und Fehlerdiagnose]] als zentrale Arbeitsseite. Der [[Status-Monitor]] hilft bei der laufenden Übersicht.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Das Projekt ist bereit zur Übergabe, wenn …&#039;&#039;&#039; alle Abnahmepunkte entweder bestätigt oder als bekannte Restpunkte mit Verantwortlichem und Termin dokumentiert sind.&lt;br /&gt;
&lt;br /&gt;
== 7. Projekt sauber übergeben ==&lt;br /&gt;
&lt;br /&gt;
Ergänze zum Abschluss die Projektseite um:&lt;br /&gt;
&lt;br /&gt;
* öffentliche und interne Adressen ohne geheime Bestandteile,&lt;br /&gt;
* eingesetzte Container und Release-Versionen,&lt;br /&gt;
* Stationsliste,&lt;br /&gt;
* Betriebsart und besondere Konfiguration,&lt;br /&gt;
* zuständige Personen,&lt;br /&gt;
* Datum und Ergebnis der Abnahme,&lt;br /&gt;
* bekannte Restpunkte,&lt;br /&gt;
* Verweise auf Sicherung, Passwortmanager-Eintrag und weitere Betriebsdokumentation.&lt;br /&gt;
&lt;br /&gt;
Setze den Projektstatus in der [[Projektübersicht]] anschließend auf &#039;&#039;&#039;Betrieb&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Wenn etwas nicht wie erwartet funktioniert ==&lt;br /&gt;
&lt;br /&gt;
Gehe vom letzten erfolgreichen Prüfpunkt aus zurück. Prüfe zunächst nur den betroffenen Abschnitt, statt mehrere Komponenten gleichzeitig zu ändern.&lt;br /&gt;
&lt;br /&gt;
Eine hilfreiche Reihenfolge ist:&lt;br /&gt;
&lt;br /&gt;
# Ist die betroffene Station oder der Server eingeschaltet und im Netz erreichbar?&lt;br /&gt;
# Läuft der zuständige Container?&lt;br /&gt;
# Ist die richtige Projektkonfiguration geladen?&lt;br /&gt;
# Funktioniert der Signalweg zwischen Station, lokalem Server und öffentlicher Seite?&lt;br /&gt;
# Gibt es aktuelle Meldungen in den Container-Protokollen oder im [[Status-Monitor]]?&lt;br /&gt;
&lt;br /&gt;
Dokumentiere Ursache und Lösung auf der Projektseite, wenn der Fehler projektspezifisch war. Allgemein wiederverwendbare Erkenntnisse gehören nach [[Wartung, Backups und Fehlerdiagnose]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;br /&gt;
[[Kategorie:Projekte]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Wartung,_Backups_und_Fehlerdiagnose&amp;diff=86</id>
		<title>Wartung, Backups und Fehlerdiagnose</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Wartung,_Backups_und_Fehlerdiagnose&amp;diff=86"/>
		<updated>2026-08-07T13:08:24Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: MongoDB-Sicherungsverfahren verknüpft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wartung, Backups und Fehlerdiagnose =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
Regelmäßige Wartung hält zentrale und lokale MegBes-Komponenten sicher, nachvollziehbar und wiederherstellbar. Änderungen erfolgen projektweise und mit dokumentiertem Rückkehrweg.&lt;br /&gt;
&lt;br /&gt;
== Status-Monitor ==&lt;br /&gt;
&lt;br /&gt;
Der zentrale [[Status-Monitor]] unter [https://status.megbes.de status.megbes.de] zeigt die Health-Zustände der konfigurierten External- und Internal-Instanzen. Ein grüner Status bestätigt die Erreichbarkeit des jeweiligen Management-Endpunkts, aber nicht automatisch den vollständigen Signalweg bis zur Medienstation.&lt;br /&gt;
&lt;br /&gt;
== Regelmäßige Kontrollen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bereich&lt;br /&gt;
! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Container || Laufzustand, Neustarts und aktuelle Fehler im Log&lt;br /&gt;
|-&lt;br /&gt;
| Betriebssystem || verfügbare Sicherheitsaktualisierungen und freier Speicherplatz&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerk || Erreichbarkeit, DynDNS-Auflösung und Routerweiterleitung&lt;br /&gt;
|-&lt;br /&gt;
| Zertifikate || Gültigkeitsende und korrekte Projektzuordnung&lt;br /&gt;
|-&lt;br /&gt;
| MegBes-Release || installierter Stand gegenüber freigegebenem Stand&lt;br /&gt;
|-&lt;br /&gt;
| Medienstationen || Erreichbarkeit, Rückmeldungen und automatischer Wiederanlauf&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation || Übereinstimmung von Projektseite und tatsächlichem System&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Datenbanksicherung ==&lt;br /&gt;
Das tägliche logische Backup der zentralen Datenbank ist unter [[MongoDB sichern und wiederherstellen]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Vor einer Änderung sichern ==&lt;br /&gt;
&lt;br /&gt;
Zu erfassen beziehungsweise zu sichern sind mindestens:&lt;br /&gt;
&lt;br /&gt;
* projektspezifische Konfiguration ohne ungeschützte Weitergabe von Geheimwerten&lt;br /&gt;
* Containerdefinition, Portzuordnungen und Dateimounts&lt;br /&gt;
* aktuell eingesetzter MegBes-Release&lt;br /&gt;
* Zertifikats- und Keystore-Dateien in geschützter Ablage&lt;br /&gt;
* kundenspezifische Skripte und Stationssoftware&lt;br /&gt;
* für Raspberry-Pi-Stationen gegebenenfalls ein geprüftes SD-Karten-Abbild&lt;br /&gt;
* Datum, Anlass und verantwortliche Person der Sicherung&lt;br /&gt;
&lt;br /&gt;
Eine Sicherung gilt erst als belastbar, wenn Ablageort, Lesbarkeit und vorgesehener Wiederherstellungsweg geprüft wurden.&lt;br /&gt;
&lt;br /&gt;
== Sicherer Wartungsablauf ==&lt;br /&gt;
&lt;br /&gt;
# Istzustand und konkrete Störung beziehungsweise Wartungsaufgabe dokumentieren.&lt;br /&gt;
# Projektbezogene Konfiguration und Release feststellen.&lt;br /&gt;
# Rückkehrweg und benötigte Sicherungen vorbereiten.&lt;br /&gt;
# Änderung nur an einer klar abgegrenzten Stufe durchführen.&lt;br /&gt;
# Logs und unmittelbare Erfolgskriterien prüfen.&lt;br /&gt;
# Gesamten Signalweg mit einem kontrollierten Test durchlaufen.&lt;br /&gt;
# Stationszustände und Wiederanlauf prüfen.&lt;br /&gt;
# Ergebnis und neuen Istzustand auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose nach Ebenen ==&lt;br /&gt;
&lt;br /&gt;
# Bedienoberfläche und Authentifizierung&lt;br /&gt;
# `megbes-external` und dessen Containerlog&lt;br /&gt;
# DNS, DynDNS und öffentliches Routing&lt;br /&gt;
# Router, Portweiterleitung und lokale Firewall&lt;br /&gt;
# `megbes-internal` und dessen Anwendungslog&lt;br /&gt;
# UDP-Weg im Ausstellungsnetz&lt;br /&gt;
# Medienstation, Empfängersoftware und konkrete Befehle&lt;br /&gt;
&lt;br /&gt;
Details: [[Routing und Signalweg]].&lt;br /&gt;
&lt;br /&gt;
== Sichere Abbruchpunkte ==&lt;br /&gt;
&lt;br /&gt;
Die Arbeit wird abgebrochen und der letzte bekannte Zustand wiederhergestellt, wenn die Projektzuordnung unklar ist, eine Änderung mehrere Kundencontainer unerwartet betrifft, Geheimwerte fehlen oder nicht eindeutig zugeordnet sind, keine belastbare Sicherung existiert oder sich der bisherige Release nicht bestimmen lässt.&lt;br /&gt;
&lt;br /&gt;
== Nachkontrolle ==&lt;br /&gt;
&lt;br /&gt;
* öffentliche Anwendung erreichbar&lt;br /&gt;
* interner Server erreichbar&lt;br /&gt;
* mindestens ein repräsentativer Steuerbefehl erfolgreich&lt;br /&gt;
* Rückmeldung einer stationsgesteuerten Station erfolgreich&lt;br /&gt;
* keine neue Fehlerserie in den Logs&lt;br /&gt;
* Dokumentation und tatsächlicher Zustand stimmen überein&lt;br /&gt;
&lt;br /&gt;
== Zentraler Server ==&lt;br /&gt;
Der geprüfte Istzustand und das Berechtigungsmodell sind unter [[Zentraler MegBes-Server – Inventur und Administration]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Wartung]]&lt;br /&gt;
[[Kategorie:Fehlerdiagnose]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Zentraler_MegBes-Server_%E2%80%93_Inventur_und_Administration&amp;diff=85</id>
		<title>Zentraler MegBes-Server – Inventur und Administration</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Zentraler_MegBes-Server_%E2%80%93_Inventur_und_Administration&amp;diff=85"/>
		<updated>2026-08-07T13:08:24Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: MongoDB-Backupautomatisierung und Wiki-Logo ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Zentraler MegBes-Server – Inventur und Administration =&lt;br /&gt;
&lt;br /&gt;
== Zweck und Status ==&lt;br /&gt;
Diese Seite dokumentiert den geprüften Istzustand, das Berechtigungsmodell und das Inventurverfahren des zentralen MegBes-Servers. Sie ist die technische Grundlage für Wartung, Fehlerdiagnose und das spätere Anlegen neuer Kundencontainer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stand der Bestandsaufnahme: 7. August 2026.&#039;&#039;&#039; System, Container, Mounts, Hostbindungen, Plesk-Proxy-Zuordnungen, Firewall-Grundzustand und vorhandene Plesk-Sicherungen wurden ausschließlich lesend aufgenommen. MongoDB-Authentisierung, Herkunft der Containerdefinitionen und ein praktischer Wiederherstellungstest bleiben offen. Vorläufige Beobachtungen sind ausdrücklich als solche gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
== Serverbasis ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Geprüfter Stand&lt;br /&gt;
|-&lt;br /&gt;
| Hosting || IONOS-Server mit Plesk&lt;br /&gt;
|-&lt;br /&gt;
| Betriebssystem || Ubuntu 24.04.4 LTS, x86_64&lt;br /&gt;
|-&lt;br /&gt;
| Plesk || Plesk Obsidian 18.0.79.5&lt;br /&gt;
|-&lt;br /&gt;
| Container-Laufzeit || Docker 29.7.2&lt;br /&gt;
|-&lt;br /&gt;
| Arbeitsspeicher || 15,55 GiB für die Container verfügbar&lt;br /&gt;
|-&lt;br /&gt;
| Massenspeicher || 464 GiB gesamt, rund 22 GiB belegt; zum Prüfzeitpunkt kein Kapazitätsengpass&lt;br /&gt;
|-&lt;br /&gt;
| Swap || nicht eingerichtet&lt;br /&gt;
|-&lt;br /&gt;
| Laufzeit des Hosts || rund 94 Tage zum Prüfzeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| Docker-Netzwerke || Standardnetzwerke `bridge`, `host` und `none`; keine benannten projektspezifischen Netzwerke&lt;br /&gt;
|-&lt;br /&gt;
| Docker-Volumes || Keine benannten Volumes; persistente Daten werden voraussichtlich über Bind-Mounts bereitgestellt und müssen noch geprüft werden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die öffentliche IP-Adresse, Zugangsdaten und weiteren sicherheitsrelevanten Verbindungsdaten werden nicht auf dieser Seite veröffentlicht. Sie liegen in der geschützten System- beziehungsweise Passwortdokumentation.&lt;br /&gt;
&lt;br /&gt;
== Berechtigungsmodell für Administration ==&lt;br /&gt;
Für automatisierte Prüfung und unterstützte Administration existiert der eigene Serverbenutzer `clawtronics` mit separatem ED25519-Schlüssel.&lt;br /&gt;
&lt;br /&gt;
Der Benutzer:&lt;br /&gt;
&lt;br /&gt;
* besitzt keine Mitgliedschaft in der Gruppe `docker`,&lt;br /&gt;
* besitzt keinen pauschalen Root- oder sudo-Zugang,&lt;br /&gt;
* darf nur ausdrücklich freigegebene, root-eigene Hilfsskripte ohne Passwort ausführen,&lt;br /&gt;
* kann die freigegebenen Skripte selbst nicht verändern,&lt;br /&gt;
* erhält neue Rechte stufenweise und nur für einen dokumentierten Betriebszweck.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Read-only-Befehl `/usr/local/sbin/megbes-discovery` liefert ausschließlich Plesk-Version, Container, Images, Docker-Netzwerke, Docker-Volumes und eine momentane Ressourcenübersicht. Containeränderungen, `docker exec`, Datenbankzugriffe und Dateisystemänderungen sind nicht freigegeben.&lt;br /&gt;
&lt;br /&gt;
Die Gruppe `docker` wird nicht vergeben, da deren Mitgliedschaft praktisch Root-Rechte ermöglicht. Erweiterungen werden als eng begrenzte, root-eigene Hilfsskripte umgesetzt.&lt;br /&gt;
&lt;br /&gt;
== Aktueller Containerbestand ==&lt;br /&gt;
Zum Prüfzeitpunkt liefen 13 Container ohne sichtbare Neustartschleife.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Container !! Image beziehungsweise Release !! Hostbindung !! Aufgabe&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-status` || `tinetronics/megbes-status:AUGUST-2026-2-RELEASE` || alle IPv4-Schnittstellen, Port 9990 || zentraler [[Status-Monitor]]&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-tine` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32770 || Kundenprojekt Tine&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-limes` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32780 || Kundenprojekt Limes&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-gkp` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32769 || Kundenprojekt GKP&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-bayam` || `MARCH-2026-1-RELEASE` || nur localhost, Port 32768 || Kundenprojekt BayAM&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-miqua` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32779 || Kundenprojekt MiQua&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-messe` || `MARCH-2026-1-RELEASE` || alle IPv4- und IPv6-Schnittstellen, Port 32771 || Kundenprojekt Messe&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-hon` || `MARCH-2026-1-RELEASE` || nur localhost, Port 9997 || Kundenprojekt HoN&lt;br /&gt;
|-&lt;br /&gt;
| `mediawiki` || `mediawiki:latest` || nur localhost, Port 49155 || internes MegBes-Wiki&lt;br /&gt;
|-&lt;br /&gt;
| `mongodb` || `mongo:7.0.12` || alle IPv4-Schnittstellen, Port 49154 || zentrale MongoDB&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-nowalux` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 34615 || Kundenprojekt NowaLux&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-miquaguide` || `MARCH-2026-1-RELEASE` || alle IPv4- und IPv6-Schnittstellen, Port 32774 || Kundenprojekt MiQua Guide&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-gse` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32805 || Kundenprojekt GSE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Hostbindung zeigt, an welchen Schnittstellen Docker lauscht. Sie beweist allein noch keine Erreichbarkeit aus dem Internet; dafür müssen zusätzlich Plesk-, Firewall- und Providerregeln geprüft werden.&lt;br /&gt;
&lt;br /&gt;
== Containerbetrieb und Mounts ==&lt;br /&gt;
Alle Container verwenden die Restart-Policy `unless-stopped`. Kein Container besitzt einen Docker-Healthcheck. Die angezeigten Speicherlimits entsprechen jeweils dem gesamten Hostspeicher; damit sind keine individuellen Container-Speichergrenzen erkennbar.&lt;br /&gt;
&lt;br /&gt;
Die persistenten beziehungsweise extern bereitgestellten Daten werden über beschreibbare Bind-Mounts eingebunden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bereich !! Hostpfad !! Containerpfad !! Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| allgemeine Schlüsselablage || `/home/ssl` || `/opt/app/key` || bei Status-Monitor und mehreren External-Containern eingebunden&lt;br /&gt;
|-&lt;br /&gt;
| allgemeine Zertifikate || `/home/certs` || `/opt/app/certs` || beim Status-Monitor eingebunden&lt;br /&gt;
|-&lt;br /&gt;
| projektspezifische Zertifikate || `/home/certs/&amp;lt;projekt&amp;gt;` || `/opt/app/certs` || bei Tine, Limes, BayAM, MiQua, Messe, HoN, MiQua Guide und GSE&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki-Daten || `/home/megbeswiki` || `/var/www/data` || enthält die persistente Wiki-Konfiguration und -Daten&lt;br /&gt;
|-&lt;br /&gt;
| MongoDB-Daten || `/root/mdb/data` || `/data/db` || produktive Datenablage&lt;br /&gt;
|-&lt;br /&gt;
| MongoDB-Konfiguration || `/root/mdb/config` || `/data/configdb` || Konfigurationsdatenbank&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alle ermittelten Mounts sind mit Schreibrecht eingebunden. Für reine Zertifikats- und Schlüsselablagen ist später zu prüfen, ob ein Read-only-Mount genügt. Eine solche Änderung darf erst nach Prüfung der Anwendung und mit Rückkehrweg erfolgen.&lt;br /&gt;
&lt;br /&gt;
== Netzwerk und externe Erreichbarkeit ==&lt;br /&gt;
UFW ist auf dem Host inaktiv. `nftables` enthält von Docker erzeugte NAT- und Filterregeln sowie Fail2ban-Regeln. Zusätzlich muss eine vorgelagerte Provider- oder Plesk-Firewall wirken, da nicht alle lokal gebundenen Ports von außen erreichbar waren.&lt;br /&gt;
&lt;br /&gt;
Ein externer TCP-Verbindungstest am 7. August 2026 ergab:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Port beziehungsweise Gruppe !! Ergebnis&lt;br /&gt;
|-&lt;br /&gt;
| 22, 80 und 443 || öffentlich erreichbar; erwartete SSH- und Webdienste&lt;br /&gt;
|-&lt;br /&gt;
| 9990 || öffentlich direkt erreichbar; Status-Monitor zusätzlich zum Domainzugriff exponiert&lt;br /&gt;
|-&lt;br /&gt;
| 9997 und 32768 || nicht öffentlich erreichbar und lokal an `127.0.0.1` gebunden&lt;br /&gt;
|-&lt;br /&gt;
| 32769, 32770, 32771, 32774, 32779, 32780, 32805 und 34615 || trotz Bindung an alle Schnittstellen beim Test nicht öffentlich erreichbar&lt;br /&gt;
|-&lt;br /&gt;
| 49154 || MongoDB trotz Bindung an alle IPv4-Schnittstellen beim Test nicht öffentlich erreichbar&lt;br /&gt;
|-&lt;br /&gt;
| 49155 || MediaWiki nicht öffentlich direkt erreichbar und lokal an `127.0.0.1` gebunden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die externe Nichterreichbarkeit ist eine Momentaufnahme und ersetzt keine bewusst dokumentierte Firewallregel. Empfohlen ist, Reverse-Proxy-Ziele grundsätzlich an `127.0.0.1` zu binden, sofern kein direkter Zugriff erforderlich ist. Besonders Port 9990 und die MongoDB-Bindung sind vor einer Änderung zunächst gegen den betrieblichen Zweck und die Plesk-Konfiguration zu prüfen.&lt;br /&gt;
&lt;br /&gt;
== Plesk-Domains und Reverse Proxy ==&lt;br /&gt;
Plesk verwaltet die Domains beziehungsweise Subdomains `bayam`, `gkp`, `hon`, `limes`, `megbes.de`, `messe`, `miqua`, `miquaguide`, `nowalux`, `status`, `tine`, `vserver` und `wiki` unter `megbes.de`.&lt;br /&gt;
&lt;br /&gt;
Die nginx-Konfigurationen leiten die projektbezogenen Domains auf die jeweiligen Docker-Hostports weiter. Die Ziele sind derzeit überwiegend als `0.0.0.0:&amp;lt;port&amp;gt;` eingetragen. Funktional ist das möglich; als klareres internes Proxyziel sollte bei einer späteren Bereinigung `127.0.0.1:&amp;lt;port&amp;gt;` zusammen mit einer lokalen Containerbindung geprüft werden. Generierte Plesk-Konfigurationen dürfen nicht direkt und dauerhaft bearbeitet werden; Änderungen erfolgen über die zuständige Plesk-Einstellung beziehungsweise zusätzliche Konfiguration.&lt;br /&gt;
&lt;br /&gt;
== Sicherungsstand ==&lt;br /&gt;
Im Plesk-Sicherungsverzeichnis liegen tägliche inkrementelle Sicherungen mit erfolgreichen Statusmarkern bis einschließlich 7. August 2026. Erfasst sind Plesk-Systembestandteile sowie die Domains `gkp.megbes.de`, `hon.megbes.de`, `megbes.de`, `nowalux.megbes.de`, `status.megbes.de`, `vserver.megbes.de` und `wiki.megbes.de`.&lt;br /&gt;
&lt;br /&gt;
Für MongoDB wurde zusätzlich ein logisches Sicherungsverfahren mit `mongodump` eingerichtet. Der erste aktuelle, komprimierte Dump wurde erfolgreich erstellt und mittels Gzip-Test und SHA-256 geprüft. Ein Cronjob erstellt täglich um 02:17 Uhr UTC einen neuen Dump. Details und Wiederherstellungsregeln: [[MongoDB sichern und wiederherstellen]].&lt;br /&gt;
&lt;br /&gt;
Noch offen sind automatische Aufbewahrung, eine externe Kopie außerhalb des Servers und ein praktischer Wiederherstellungstest. Aus der Plesk-Dateiliste lässt sich außerdem nicht ableiten, dass `/home/certs`, `/home/ssl` und alle Containerdefinitionen vollständig gesichert werden.&lt;br /&gt;
&lt;br /&gt;
== Wiki-Logo und Persistenz ==&lt;br /&gt;
Das MegBes-Logo aus dem Status-Monitor ist im Wiki eingebunden. Die ausgelieferte Datei und das Quelllogo besitzen dieselbe SHA-256-Prüfsumme. Vor der Änderung wurde `LocalSettings.php` geschützt unter `/home/megbeswiki/config-backups` gesichert.&lt;br /&gt;
&lt;br /&gt;
Logo und persistente Kopie liegen unter `/home/megbeswiki/assets`. Die aktive `LocalSettings.php` und die ausgelieferte Bilddatei befinden sich derzeit jedoch im beschreibbaren Layer des MediaWiki-Containers. Nach einer Neuerstellung des Containers muss die fest definierte Aktion `wiki-logo-install` erneut ausgeführt werden. Langfristig sollten `LocalSettings.php` und Logo als eigene Bind-Mounts in der Containerdefinition verankert werden.&lt;br /&gt;
&lt;br /&gt;
== Erste Betriebsbeobachtungen ==&lt;br /&gt;
* Alle 13 Container liefen zum Prüfzeitpunkt seit rund sechs Stunden.&lt;br /&gt;
* Die momentane CPU- und Speicherauslastung war unauffällig.&lt;br /&gt;
* Der Status-Monitor nutzt den derzeit bekannten aktuellen Release `AUGUST-2026-2-RELEASE`.&lt;br /&gt;
* Die zehn Kundencontainer von `megbes-external` verwenden `MARCH-2026-1-RELEASE`, obwohl das Image `AUGUST-2026-1-RELEASE` lokal vorhanden ist. Daraus folgt kein automatischer Updateauftrag; Freigabe, Kompatibilität und Rückkehrweg sind projektweise zu prüfen.&lt;br /&gt;
* MediaWiki sowie BayAM und HoN sind nur an localhost gebunden.&lt;br /&gt;
* Die Bindung von MongoDB an alle IPv4-Schnittstellen ist sicherheitsrelevant. Der Port war extern nicht erreichbar; Authentisierung, vorgelagerte Filterregel und tatsächlicher Verwendungszweck bleiben dennoch zu prüfen.&lt;br /&gt;
* Mehrere MegBes-Ports sind an alle Schnittstellen gebunden, waren beim externen Test mit Ausnahme von Port 9990 jedoch nicht erreichbar. Ob die Bindungen erforderlich sind oder Plesk als lokaler Reverse Proxy genügt, wird projektweise geprüft.&lt;br /&gt;
&lt;br /&gt;
== Inventurplan ==&lt;br /&gt;
Die folgenden Punkte werden ausschließlich lesend aufgenommen, bevor Betriebsänderungen erfolgen:&lt;br /&gt;
&lt;br /&gt;
# Eigentümer, Rechte und Sicherungsumfang der ermittelten Datenpfade&lt;br /&gt;
# Herkunft und reproduzierbare Definition der Container&lt;br /&gt;
# Zertifikatszuordnungen und Erneuerungsverfahren&lt;br /&gt;
# MongoDB-Authentisierung und Netzwerkbindung, ohne Geheimwerte auszugeben&lt;br /&gt;
# konsistentes Backup der MongoDB- und MediaWiki-Daten&lt;br /&gt;
# Aufbewahrungsdauer und praktischer Wiederherstellungstest&lt;br /&gt;
# Logwachstum und Logrotation der Container&lt;br /&gt;
# standardisierter Ablauf für Update, Rollback und neuen Kundencontainer&lt;br /&gt;
&lt;br /&gt;
== Regeln für Änderungen ==&lt;br /&gt;
* Vor jeder Änderung werden betroffene Container, Konfiguration, Mounts, Ports und aktueller Image-Stand gesichert beziehungsweise dokumentiert.&lt;br /&gt;
* Geheimwerte werden weder in Befehlsausgaben noch im Wiki gespeichert.&lt;br /&gt;
* Ein Container wird nur mit bekanntem Rückkehrweg ersetzt.&lt;br /&gt;
* Datenbank- und Volume-Änderungen erfolgen erst nach geprüfter Sicherung.&lt;br /&gt;
* Neustarts, Updates und neue Kundencontainer benötigen einen ausdrücklichen Auftrag.&lt;br /&gt;
* Nach Änderungen werden Anwendung, Logs, Status-Monitor und mindestens ein kontrollierter Projektablauf geprüft.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Megbes-external unter Plesk]] und [[Wartung, Backups und Fehlerdiagnose]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;br /&gt;
[[Kategorie:Plesk]]&lt;br /&gt;
[[Kategorie:Wartung]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=MongoDB_sichern_und_wiederherstellen&amp;diff=84</id>
		<title>MongoDB sichern und wiederherstellen</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=MongoDB_sichern_und_wiederherstellen&amp;diff=84"/>
		<updated>2026-08-07T13:08:23Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Geprüftes MongoDB-Dump-, Prüf- und Wiederherstellungsverfahren dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MongoDB sichern und wiederherstellen =&lt;br /&gt;
&lt;br /&gt;
== Zweck und geprüfter Stand ==&lt;br /&gt;
Die zentrale MongoDB enthält betriebsrelevante MegBes-Daten. Sie wird deshalb mit `mongodump` logisch und konsistent in ein komprimiertes Archiv gesichert. Eine Kopie des laufenden Datenverzeichnisses `/root/mdb/data` gilt nicht als Ersatz für diesen Dump.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stand: 7. August 2026.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* MongoDB läuft als Container `mongodb` mit Image `mongo:7.0.12`.&lt;br /&gt;
* Authentisierung ist aktiv; ein nicht angemeldeter Versuch, Datenbanken aufzulisten, wird abgewiesen.&lt;br /&gt;
* MongoDB Database Tools 100.10.0 mit `mongodump` und `mongorestore` sind im Container vorhanden.&lt;br /&gt;
* Der erste neue Dump wurde erfolgreich erstellt sowie per Gzip-Test und SHA-256-Prüfsumme verifiziert.&lt;br /&gt;
* Die automatische Sicherung läuft täglich um 02:17 Uhr Serverzeit (UTC), entsprechend im Sommer 04:17 Uhr in Deutschland.&lt;br /&gt;
&lt;br /&gt;
== Sicherungsablage ==&lt;br /&gt;
Die Archive liegen ausschließlich root-lesbar unter:&lt;br /&gt;
&lt;br /&gt;
 `/root/backups/mongodb/megbes-mongodb-&amp;lt;UTC-Zeitstempel&amp;gt;.archive.gz`&lt;br /&gt;
&lt;br /&gt;
Zu jedem Archiv gehört eine Datei mit SHA-256-Prüfsumme:&lt;br /&gt;
&lt;br /&gt;
 `/root/backups/mongodb/megbes-mongodb-&amp;lt;UTC-Zeitstempel&amp;gt;.archive.gz.sha256`&lt;br /&gt;
&lt;br /&gt;
Dateien und Verzeichnis besitzen restriktive Rechte. Die Datenbankzugangsdaten werden weder im Dateinamen noch im Log oder Wiki ausgegeben. `mongodump` erhält das Passwort über eine kurzlebige, nur im Container lesbare Konfigurationsdatei, die anschließend entfernt wird.&lt;br /&gt;
&lt;br /&gt;
== Automatisierung ==&lt;br /&gt;
Der Benutzer `clawtronics` besitzt einen Cron-Eintrag:&lt;br /&gt;
&lt;br /&gt;
 17 2 * * * sudo -n /usr/local/sbin/megbes-admin mongo-backup &amp;gt;&amp;gt; /home/clawtronics/mongo-backup.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
Der Cronjob darf nur die fest implementierte Aktion `mongo-backup` des root-eigenen Werkzeugs `megbes-admin` aufrufen. Ein allgemeiner Docker- oder Root-Zugang wird dadurch nicht vergeben.&lt;br /&gt;
&lt;br /&gt;
== Manuelle Sicherung ==&lt;br /&gt;
Eine zusätzliche Sicherung kann über den freigegebenen Administrationsweg erstellt werden:&lt;br /&gt;
&lt;br /&gt;
 sudo -n /usr/local/sbin/megbes-admin mongo-backup&lt;br /&gt;
&lt;br /&gt;
Erfolgskriterien:&lt;br /&gt;
&lt;br /&gt;
* Ausgabe nennt ein neues Archiv mit UTC-Zeitstempel.&lt;br /&gt;
* Archiv ist nicht leer.&lt;br /&gt;
* `gzip -t` endet erfolgreich.&lt;br /&gt;
* SHA-256-Datei wird erzeugt.&lt;br /&gt;
&lt;br /&gt;
== Status und Integritätsprüfung ==&lt;br /&gt;
Der aktuelle Stand wird ohne Ausgabe von Datenbankinhalten geprüft:&lt;br /&gt;
&lt;br /&gt;
 sudo -n /usr/local/sbin/megbes-admin mongo-backup-status&lt;br /&gt;
&lt;br /&gt;
Die Aktion listet die vorhandenen Archive und prüft beim jüngsten Dump Gzip-Struktur und SHA-256-Prüfsumme.&lt;br /&gt;
&lt;br /&gt;
== Wiederherstellung ==&lt;br /&gt;
Eine Wiederherstellung wird nicht automatisiert gegen die produktive Datenbank ausgeführt. Vorher sind zwingend festzulegen:&lt;br /&gt;
&lt;br /&gt;
# Zielsystem oder isolierter Testcontainer&lt;br /&gt;
# gewünschter Sicherungszeitpunkt&lt;br /&gt;
# Rückkehrweg und aktuelle zusätzliche Sicherung&lt;br /&gt;
# Umgang mit bestehenden Datenbanken und Collections&lt;br /&gt;
# erwartete Ausfallzeit&lt;br /&gt;
# Funktions- und Vollständigkeitsprüfung&lt;br /&gt;
&lt;br /&gt;
Die Wiederherstellung erfolgt grundsätzlich mit `mongorestore`, `--archive`, `--gzip` und `--stopOnError`. Passwörter gehören in eine geschützte Konfigurationsdatei und nicht in die Prozessargumente. Der genaue Befehl wird für das konkrete Zielsystem erzeugt und vor Ausführung kontrolliert.&lt;br /&gt;
&lt;br /&gt;
Mindestens einmal nach Einrichtung sowie anschließend regelmäßig ist ein Wiederherstellungstest in einer isolierten MongoDB-Instanz durchzuführen. Erst ein erfolgreich zurückgespielter und fachlich geprüfter Dump gilt als belastbare Sicherung.&lt;br /&gt;
&lt;br /&gt;
== Aufbewahrung und externe Kopie ==&lt;br /&gt;
Eine automatische Löschung alter Dumps ist noch nicht aktiviert. Vor Einführung einer Rotation sind Aufbewahrungsdauer und externes Sicherungsziel festzulegen. Empfohlen sind mehrere Generationen sowie mindestens eine Kopie außerhalb des Servers; lokale Dumps allein schützen nicht vor Ausfall oder Verlust des gesamten Servers.&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
* [https://www.mongodb.com/docs/database-tools/mongodump/ MongoDB-Dokumentation zu mongodump]&lt;br /&gt;
* [https://www.mongodb.com/docs/database-tools/mongorestore/ MongoDB-Dokumentation zu mongorestore]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:MongoDB]]&lt;br /&gt;
[[Kategorie:Backup]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Zentraler_MegBes-Server_%E2%80%93_Inventur_und_Administration&amp;diff=83</id>
		<title>Zentraler MegBes-Server – Inventur und Administration</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Zentraler_MegBes-Server_%E2%80%93_Inventur_und_Administration&amp;diff=83"/>
		<updated>2026-08-07T12:57:22Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Vertiefte Read-only-Inventur: Mounts, Ports, Proxy, Firewall und Sicherungsstand ergänzt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Zentraler MegBes-Server – Inventur und Administration =&lt;br /&gt;
&lt;br /&gt;
== Zweck und Status ==&lt;br /&gt;
Diese Seite dokumentiert den geprüften Istzustand, das Berechtigungsmodell und das Inventurverfahren des zentralen MegBes-Servers. Sie ist die technische Grundlage für Wartung, Fehlerdiagnose und das spätere Anlegen neuer Kundencontainer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stand der Bestandsaufnahme: 7. August 2026.&#039;&#039;&#039; System, Container, Mounts, Hostbindungen, Plesk-Proxy-Zuordnungen, Firewall-Grundzustand und vorhandene Plesk-Sicherungen wurden ausschließlich lesend aufgenommen. MongoDB-Authentisierung, Herkunft der Containerdefinitionen und ein praktischer Wiederherstellungstest bleiben offen. Vorläufige Beobachtungen sind ausdrücklich als solche gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
== Serverbasis ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Geprüfter Stand&lt;br /&gt;
|-&lt;br /&gt;
| Hosting || IONOS-Server mit Plesk&lt;br /&gt;
|-&lt;br /&gt;
| Betriebssystem || Ubuntu 24.04.4 LTS, x86_64&lt;br /&gt;
|-&lt;br /&gt;
| Plesk || Plesk Obsidian 18.0.79.5&lt;br /&gt;
|-&lt;br /&gt;
| Container-Laufzeit || Docker 29.7.2&lt;br /&gt;
|-&lt;br /&gt;
| Arbeitsspeicher || 15,55 GiB für die Container verfügbar&lt;br /&gt;
|-&lt;br /&gt;
| Massenspeicher || 464 GiB gesamt, rund 22 GiB belegt; zum Prüfzeitpunkt kein Kapazitätsengpass&lt;br /&gt;
|-&lt;br /&gt;
| Swap || nicht eingerichtet&lt;br /&gt;
|-&lt;br /&gt;
| Laufzeit des Hosts || rund 94 Tage zum Prüfzeitpunkt&lt;br /&gt;
|-&lt;br /&gt;
| Docker-Netzwerke || Standardnetzwerke `bridge`, `host` und `none`; keine benannten projektspezifischen Netzwerke&lt;br /&gt;
|-&lt;br /&gt;
| Docker-Volumes || Keine benannten Volumes; persistente Daten werden voraussichtlich über Bind-Mounts bereitgestellt und müssen noch geprüft werden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die öffentliche IP-Adresse, Zugangsdaten und weiteren sicherheitsrelevanten Verbindungsdaten werden nicht auf dieser Seite veröffentlicht. Sie liegen in der geschützten System- beziehungsweise Passwortdokumentation.&lt;br /&gt;
&lt;br /&gt;
== Berechtigungsmodell für Administration ==&lt;br /&gt;
Für automatisierte Prüfung und unterstützte Administration existiert der eigene Serverbenutzer `clawtronics` mit separatem ED25519-Schlüssel.&lt;br /&gt;
&lt;br /&gt;
Der Benutzer:&lt;br /&gt;
&lt;br /&gt;
* besitzt keine Mitgliedschaft in der Gruppe `docker`,&lt;br /&gt;
* besitzt keinen pauschalen Root- oder sudo-Zugang,&lt;br /&gt;
* darf nur ausdrücklich freigegebene, root-eigene Hilfsskripte ohne Passwort ausführen,&lt;br /&gt;
* kann die freigegebenen Skripte selbst nicht verändern,&lt;br /&gt;
* erhält neue Rechte stufenweise und nur für einen dokumentierten Betriebszweck.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Read-only-Befehl `/usr/local/sbin/megbes-discovery` liefert ausschließlich Plesk-Version, Container, Images, Docker-Netzwerke, Docker-Volumes und eine momentane Ressourcenübersicht. Containeränderungen, `docker exec`, Datenbankzugriffe und Dateisystemänderungen sind nicht freigegeben.&lt;br /&gt;
&lt;br /&gt;
Die Gruppe `docker` wird nicht vergeben, da deren Mitgliedschaft praktisch Root-Rechte ermöglicht. Erweiterungen werden als eng begrenzte, root-eigene Hilfsskripte umgesetzt.&lt;br /&gt;
&lt;br /&gt;
== Aktueller Containerbestand ==&lt;br /&gt;
Zum Prüfzeitpunkt liefen 13 Container ohne sichtbare Neustartschleife.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Container !! Image beziehungsweise Release !! Hostbindung !! Aufgabe&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-status` || `tinetronics/megbes-status:AUGUST-2026-2-RELEASE` || alle IPv4-Schnittstellen, Port 9990 || zentraler [[Status-Monitor]]&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-tine` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32770 || Kundenprojekt Tine&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-limes` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32780 || Kundenprojekt Limes&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-gkp` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32769 || Kundenprojekt GKP&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-bayam` || `MARCH-2026-1-RELEASE` || nur localhost, Port 32768 || Kundenprojekt BayAM&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-miqua` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32779 || Kundenprojekt MiQua&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-messe` || `MARCH-2026-1-RELEASE` || alle IPv4- und IPv6-Schnittstellen, Port 32771 || Kundenprojekt Messe&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-hon` || `MARCH-2026-1-RELEASE` || nur localhost, Port 9997 || Kundenprojekt HoN&lt;br /&gt;
|-&lt;br /&gt;
| `mediawiki` || `mediawiki:latest` || nur localhost, Port 49155 || internes MegBes-Wiki&lt;br /&gt;
|-&lt;br /&gt;
| `mongodb` || `mongo:7.0.12` || alle IPv4-Schnittstellen, Port 49154 || zentrale MongoDB&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-nowalux` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 34615 || Kundenprojekt NowaLux&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-miquaguide` || `MARCH-2026-1-RELEASE` || alle IPv4- und IPv6-Schnittstellen, Port 32774 || Kundenprojekt MiQua Guide&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-gse` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32805 || Kundenprojekt GSE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Hostbindung zeigt, an welchen Schnittstellen Docker lauscht. Sie beweist allein noch keine Erreichbarkeit aus dem Internet; dafür müssen zusätzlich Plesk-, Firewall- und Providerregeln geprüft werden.&lt;br /&gt;
&lt;br /&gt;
== Containerbetrieb und Mounts ==&lt;br /&gt;
Alle Container verwenden die Restart-Policy `unless-stopped`. Kein Container besitzt einen Docker-Healthcheck. Die angezeigten Speicherlimits entsprechen jeweils dem gesamten Hostspeicher; damit sind keine individuellen Container-Speichergrenzen erkennbar.&lt;br /&gt;
&lt;br /&gt;
Die persistenten beziehungsweise extern bereitgestellten Daten werden über beschreibbare Bind-Mounts eingebunden:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bereich !! Hostpfad !! Containerpfad !! Bemerkung&lt;br /&gt;
|-&lt;br /&gt;
| allgemeine Schlüsselablage || `/home/ssl` || `/opt/app/key` || bei Status-Monitor und mehreren External-Containern eingebunden&lt;br /&gt;
|-&lt;br /&gt;
| allgemeine Zertifikate || `/home/certs` || `/opt/app/certs` || beim Status-Monitor eingebunden&lt;br /&gt;
|-&lt;br /&gt;
| projektspezifische Zertifikate || `/home/certs/&amp;lt;projekt&amp;gt;` || `/opt/app/certs` || bei Tine, Limes, BayAM, MiQua, Messe, HoN, MiQua Guide und GSE&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki-Daten || `/home/megbeswiki` || `/var/www/data` || enthält die persistente Wiki-Konfiguration und -Daten&lt;br /&gt;
|-&lt;br /&gt;
| MongoDB-Daten || `/root/mdb/data` || `/data/db` || produktive Datenablage&lt;br /&gt;
|-&lt;br /&gt;
| MongoDB-Konfiguration || `/root/mdb/config` || `/data/configdb` || Konfigurationsdatenbank&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alle ermittelten Mounts sind mit Schreibrecht eingebunden. Für reine Zertifikats- und Schlüsselablagen ist später zu prüfen, ob ein Read-only-Mount genügt. Eine solche Änderung darf erst nach Prüfung der Anwendung und mit Rückkehrweg erfolgen.&lt;br /&gt;
&lt;br /&gt;
== Netzwerk und externe Erreichbarkeit ==&lt;br /&gt;
UFW ist auf dem Host inaktiv. `nftables` enthält von Docker erzeugte NAT- und Filterregeln sowie Fail2ban-Regeln. Zusätzlich muss eine vorgelagerte Provider- oder Plesk-Firewall wirken, da nicht alle lokal gebundenen Ports von außen erreichbar waren.&lt;br /&gt;
&lt;br /&gt;
Ein externer TCP-Verbindungstest am 7. August 2026 ergab:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Port beziehungsweise Gruppe !! Ergebnis&lt;br /&gt;
|-&lt;br /&gt;
| 22, 80 und 443 || öffentlich erreichbar; erwartete SSH- und Webdienste&lt;br /&gt;
|-&lt;br /&gt;
| 9990 || öffentlich direkt erreichbar; Status-Monitor zusätzlich zum Domainzugriff exponiert&lt;br /&gt;
|-&lt;br /&gt;
| 9997 und 32768 || nicht öffentlich erreichbar und lokal an `127.0.0.1` gebunden&lt;br /&gt;
|-&lt;br /&gt;
| 32769, 32770, 32771, 32774, 32779, 32780, 32805 und 34615 || trotz Bindung an alle Schnittstellen beim Test nicht öffentlich erreichbar&lt;br /&gt;
|-&lt;br /&gt;
| 49154 || MongoDB trotz Bindung an alle IPv4-Schnittstellen beim Test nicht öffentlich erreichbar&lt;br /&gt;
|-&lt;br /&gt;
| 49155 || MediaWiki nicht öffentlich direkt erreichbar und lokal an `127.0.0.1` gebunden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die externe Nichterreichbarkeit ist eine Momentaufnahme und ersetzt keine bewusst dokumentierte Firewallregel. Empfohlen ist, Reverse-Proxy-Ziele grundsätzlich an `127.0.0.1` zu binden, sofern kein direkter Zugriff erforderlich ist. Besonders Port 9990 und die MongoDB-Bindung sind vor einer Änderung zunächst gegen den betrieblichen Zweck und die Plesk-Konfiguration zu prüfen.&lt;br /&gt;
&lt;br /&gt;
== Plesk-Domains und Reverse Proxy ==&lt;br /&gt;
Plesk verwaltet die Domains beziehungsweise Subdomains `bayam`, `gkp`, `hon`, `limes`, `megbes.de`, `messe`, `miqua`, `miquaguide`, `nowalux`, `status`, `tine`, `vserver` und `wiki` unter `megbes.de`.&lt;br /&gt;
&lt;br /&gt;
Die nginx-Konfigurationen leiten die projektbezogenen Domains auf die jeweiligen Docker-Hostports weiter. Die Ziele sind derzeit überwiegend als `0.0.0.0:&amp;lt;port&amp;gt;` eingetragen. Funktional ist das möglich; als klareres internes Proxyziel sollte bei einer späteren Bereinigung `127.0.0.1:&amp;lt;port&amp;gt;` zusammen mit einer lokalen Containerbindung geprüft werden. Generierte Plesk-Konfigurationen dürfen nicht direkt und dauerhaft bearbeitet werden; Änderungen erfolgen über die zuständige Plesk-Einstellung beziehungsweise zusätzliche Konfiguration.&lt;br /&gt;
&lt;br /&gt;
== Sicherungsstand ==&lt;br /&gt;
Im Plesk-Sicherungsverzeichnis liegen tägliche inkrementelle Sicherungen mit erfolgreichen Statusmarkern bis einschließlich 7. August 2026. Erfasst sind Plesk-Systembestandteile sowie die Domains `gkp.megbes.de`, `hon.megbes.de`, `megbes.de`, `nowalux.megbes.de`, `status.megbes.de`, `vserver.megbes.de` und `wiki.megbes.de`.&lt;br /&gt;
&lt;br /&gt;
Aus der Dateiliste lässt sich noch nicht ableiten, dass `/root/mdb/data`, `/root/mdb/config`, `/home/certs`, `/home/ssl` und alle Containerdefinitionen vollständig und konsistent gesichert werden. Insbesondere die MongoDB benötigt ein anwendungsgeeignetes Backupverfahren; eine reine Dateikopie im laufenden Betrieb ist nicht automatisch konsistent. Ablageziel, Aufbewahrungsdauer und ein praktischer Wiederherstellungstest bleiben zu dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Erste Betriebsbeobachtungen ==&lt;br /&gt;
* Alle 13 Container liefen zum Prüfzeitpunkt seit rund sechs Stunden.&lt;br /&gt;
* Die momentane CPU- und Speicherauslastung war unauffällig.&lt;br /&gt;
* Der Status-Monitor nutzt den derzeit bekannten aktuellen Release `AUGUST-2026-2-RELEASE`.&lt;br /&gt;
* Die zehn Kundencontainer von `megbes-external` verwenden `MARCH-2026-1-RELEASE`, obwohl das Image `AUGUST-2026-1-RELEASE` lokal vorhanden ist. Daraus folgt kein automatischer Updateauftrag; Freigabe, Kompatibilität und Rückkehrweg sind projektweise zu prüfen.&lt;br /&gt;
* MediaWiki sowie BayAM und HoN sind nur an localhost gebunden.&lt;br /&gt;
* Die Bindung von MongoDB an alle IPv4-Schnittstellen ist sicherheitsrelevant. Der Port war extern nicht erreichbar; Authentisierung, vorgelagerte Filterregel und tatsächlicher Verwendungszweck bleiben dennoch zu prüfen.&lt;br /&gt;
* Mehrere MegBes-Ports sind an alle Schnittstellen gebunden, waren beim externen Test mit Ausnahme von Port 9990 jedoch nicht erreichbar. Ob die Bindungen erforderlich sind oder Plesk als lokaler Reverse Proxy genügt, wird projektweise geprüft.&lt;br /&gt;
&lt;br /&gt;
== Inventurplan ==&lt;br /&gt;
Die folgenden Punkte werden ausschließlich lesend aufgenommen, bevor Betriebsänderungen erfolgen:&lt;br /&gt;
&lt;br /&gt;
# Eigentümer, Rechte und Sicherungsumfang der ermittelten Datenpfade&lt;br /&gt;
# Herkunft und reproduzierbare Definition der Container&lt;br /&gt;
# Zertifikatszuordnungen und Erneuerungsverfahren&lt;br /&gt;
# MongoDB-Authentisierung und Netzwerkbindung, ohne Geheimwerte auszugeben&lt;br /&gt;
# konsistentes Backup der MongoDB- und MediaWiki-Daten&lt;br /&gt;
# Aufbewahrungsdauer und praktischer Wiederherstellungstest&lt;br /&gt;
# Logwachstum und Logrotation der Container&lt;br /&gt;
# standardisierter Ablauf für Update, Rollback und neuen Kundencontainer&lt;br /&gt;
&lt;br /&gt;
== Regeln für Änderungen ==&lt;br /&gt;
* Vor jeder Änderung werden betroffene Container, Konfiguration, Mounts, Ports und aktueller Image-Stand gesichert beziehungsweise dokumentiert.&lt;br /&gt;
* Geheimwerte werden weder in Befehlsausgaben noch im Wiki gespeichert.&lt;br /&gt;
* Ein Container wird nur mit bekanntem Rückkehrweg ersetzt.&lt;br /&gt;
* Datenbank- und Volume-Änderungen erfolgen erst nach geprüfter Sicherung.&lt;br /&gt;
* Neustarts, Updates und neue Kundencontainer benötigen einen ausdrücklichen Auftrag.&lt;br /&gt;
* Nach Änderungen werden Anwendung, Logs, Status-Monitor und mindestens ein kontrollierter Projektablauf geprüft.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Megbes-external unter Plesk]] und [[Wartung, Backups und Fehlerdiagnose]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;br /&gt;
[[Kategorie:Plesk]]&lt;br /&gt;
[[Kategorie:Wartung]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Megbes-external_unter_Plesk&amp;diff=82</id>
		<title>Megbes-external unter Plesk</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Megbes-external_unter_Plesk&amp;diff=82"/>
		<updated>2026-08-07T12:45:02Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Zentrale Serverinventur verknüpft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Megbes-external unter Plesk =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
`megbes-external` bildet die öffentlich erreichbare Ebene von MegBes. Auf dem zentralen IONOS-Server wird für jedes Kundenprojekt ein eigener Docker-Container über Plesk betrieben. Die Trennung verhindert, dass projektspezifische Domains, Ports, Konfigurationen und Releases unkontrolliert vermischt werden.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
&lt;br /&gt;
* Projekt ist nach [[Neukunde]] angelegt.&lt;br /&gt;
* Passende Konfiguration liegt im privaten Repository `tinetronics/megbes-config` vor.&lt;br /&gt;
* Freier externer Port und vorgesehene Domain beziehungsweise Subdomain sind festgelegt.&lt;br /&gt;
* Das freigegebene MegBes-Release ist bekannt.&lt;br /&gt;
* Adresse und Erreichbarkeit von `megbes-internal` sind geklärt.&lt;br /&gt;
* Benötigte Zertifikate sind vorhanden; siehe [[Zertifikate]].&lt;br /&gt;
&lt;br /&gt;
== Grundaufbau je Projekt ==&lt;br /&gt;
&lt;br /&gt;
Für jedes Projekt werden getrennt dokumentiert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Dokumentationsort&lt;br /&gt;
|-&lt;br /&gt;
| Projekt- und Containername || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| Domain oder Subdomain || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| externe Portzuordnung || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| verwendete Konfigurationsdatei || Projektseite, ohne Geheimwerte&lt;br /&gt;
|-&lt;br /&gt;
| installierter Release || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| Betriebsart und Authentifizierungsvariante || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| Adresse des internen Servers || Projektseite&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ablauf in Plesk ==&lt;br /&gt;
&lt;br /&gt;
# Vorhandene Container prüfen und einen eindeutigen Projektnamen wählen.&lt;br /&gt;
# Den für das Projekt freigegebenen Image- beziehungsweise Release-Stand auswählen.&lt;br /&gt;
# Projektspezifische Umgebungsvariablen und benötigte Dateimounts eintragen.&lt;br /&gt;
# Portzuordnung so wählen, dass sie nicht mit einem bestehenden Container kollidiert.&lt;br /&gt;
# Domain oder Subdomain auf den vorgesehenen Container beziehungsweise Port routen.&lt;br /&gt;
# Falls erforderlich, Zertifikatsdateien ausschließlich aus der geschützten Ablage einbinden.&lt;br /&gt;
# Container starten und Startprotokoll auf Konfigurations-, Port- und Zertifikatsfehler prüfen.&lt;br /&gt;
# Erreichbarkeit der öffentlichen Anwendung testen.&lt;br /&gt;
# Einen kontrollierten Aufruf bis `megbes-internal` durchführen; siehe [[Routing und Signalweg]].&lt;br /&gt;
# Alle nicht geheimen Istwerte auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Erfolgskriterien ==&lt;br /&gt;
&lt;br /&gt;
* Der Container läuft ohne Neustartschleife.&lt;br /&gt;
* Die projektbezogene Domain liefert die vorgesehene Anwendung.&lt;br /&gt;
* Das Log enthält keine ungelösten Konfigurations- oder Zertifikatsfehler.&lt;br /&gt;
* `megbes-external` erreicht den korrekten internen Server.&lt;br /&gt;
* Ein Testbefehl erreicht ausschließlich das vorgesehene Projekt.&lt;br /&gt;
&lt;br /&gt;
== Sichere Änderungen und Updates ==&lt;br /&gt;
&lt;br /&gt;
Vor einer Änderung sind Containername, Portbelegung, eingebundene Dateien, Konfiguration und aktueller Release zu erfassen. Updates werden zunächst gegen die projektspezifische Konfiguration geprüft. Ein bestehender Container darf erst ersetzt werden, wenn Rückkehrweg und bisheriger Release bekannt sind.&lt;br /&gt;
&lt;br /&gt;
== Typische Fehler ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fehlerbild&lt;br /&gt;
! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Container startet wiederholt neu || Startlog, Konfigurationsdatei, Mounts und Umgebungsvariablen prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Domain ist nicht erreichbar || DNS, Plesk-Routing, Portzuordnung und Containerstatus prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Anwendung ist erreichbar, interner Server nicht || Zieladresse, DynDNS, Routerfreigabe und Zertifikate prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Falsches Projekt reagiert || Domain-, Port- und Containerzuordnung sofort prüfen; keinen weiteren Funktionstest senden.&lt;br /&gt;
|-&lt;br /&gt;
| Zertifikatsfehler || Dateipfad, Gültigkeit und Zuordnung nach [[Zertifikate]] prüfen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sicherheitsregeln ==&lt;br /&gt;
&lt;br /&gt;
Passwörter, Tokens, private Schlüssel, geheime Headerwerte und vollständige Zugangsdaten dürfen weder auf der Wiki-Seite noch in Befehlsbeispielen stehen. Das Wiki dokumentiert Bezeichnungen, Ablageorte und Zuständigkeiten, nicht die Geheimwerte selbst.&lt;br /&gt;
&lt;br /&gt;
== Zentraler Server ==&lt;br /&gt;
Der geprüfte Istzustand und das Berechtigungsmodell sind unter [[Zentraler MegBes-Server – Inventur und Administration]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;br /&gt;
[[Kategorie:Plesk]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Wartung,_Backups_und_Fehlerdiagnose&amp;diff=81</id>
		<title>Wartung, Backups und Fehlerdiagnose</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Wartung,_Backups_und_Fehlerdiagnose&amp;diff=81"/>
		<updated>2026-08-07T12:45:02Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Zentrale Serverinventur verknüpft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wartung, Backups und Fehlerdiagnose =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
Regelmäßige Wartung hält zentrale und lokale MegBes-Komponenten sicher, nachvollziehbar und wiederherstellbar. Änderungen erfolgen projektweise und mit dokumentiertem Rückkehrweg.&lt;br /&gt;
&lt;br /&gt;
== Status-Monitor ==&lt;br /&gt;
&lt;br /&gt;
Der zentrale [[Status-Monitor]] unter [https://status.megbes.de status.megbes.de] zeigt die Health-Zustände der konfigurierten External- und Internal-Instanzen. Ein grüner Status bestätigt die Erreichbarkeit des jeweiligen Management-Endpunkts, aber nicht automatisch den vollständigen Signalweg bis zur Medienstation.&lt;br /&gt;
&lt;br /&gt;
== Regelmäßige Kontrollen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bereich&lt;br /&gt;
! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Container || Laufzustand, Neustarts und aktuelle Fehler im Log&lt;br /&gt;
|-&lt;br /&gt;
| Betriebssystem || verfügbare Sicherheitsaktualisierungen und freier Speicherplatz&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerk || Erreichbarkeit, DynDNS-Auflösung und Routerweiterleitung&lt;br /&gt;
|-&lt;br /&gt;
| Zertifikate || Gültigkeitsende und korrekte Projektzuordnung&lt;br /&gt;
|-&lt;br /&gt;
| MegBes-Release || installierter Stand gegenüber freigegebenem Stand&lt;br /&gt;
|-&lt;br /&gt;
| Medienstationen || Erreichbarkeit, Rückmeldungen und automatischer Wiederanlauf&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation || Übereinstimmung von Projektseite und tatsächlichem System&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vor einer Änderung sichern ==&lt;br /&gt;
&lt;br /&gt;
Zu erfassen beziehungsweise zu sichern sind mindestens:&lt;br /&gt;
&lt;br /&gt;
* projektspezifische Konfiguration ohne ungeschützte Weitergabe von Geheimwerten&lt;br /&gt;
* Containerdefinition, Portzuordnungen und Dateimounts&lt;br /&gt;
* aktuell eingesetzter MegBes-Release&lt;br /&gt;
* Zertifikats- und Keystore-Dateien in geschützter Ablage&lt;br /&gt;
* kundenspezifische Skripte und Stationssoftware&lt;br /&gt;
* für Raspberry-Pi-Stationen gegebenenfalls ein geprüftes SD-Karten-Abbild&lt;br /&gt;
* Datum, Anlass und verantwortliche Person der Sicherung&lt;br /&gt;
&lt;br /&gt;
Eine Sicherung gilt erst als belastbar, wenn Ablageort, Lesbarkeit und vorgesehener Wiederherstellungsweg geprüft wurden.&lt;br /&gt;
&lt;br /&gt;
== Sicherer Wartungsablauf ==&lt;br /&gt;
&lt;br /&gt;
# Istzustand und konkrete Störung beziehungsweise Wartungsaufgabe dokumentieren.&lt;br /&gt;
# Projektbezogene Konfiguration und Release feststellen.&lt;br /&gt;
# Rückkehrweg und benötigte Sicherungen vorbereiten.&lt;br /&gt;
# Änderung nur an einer klar abgegrenzten Stufe durchführen.&lt;br /&gt;
# Logs und unmittelbare Erfolgskriterien prüfen.&lt;br /&gt;
# Gesamten Signalweg mit einem kontrollierten Test durchlaufen.&lt;br /&gt;
# Stationszustände und Wiederanlauf prüfen.&lt;br /&gt;
# Ergebnis und neuen Istzustand auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose nach Ebenen ==&lt;br /&gt;
&lt;br /&gt;
# Bedienoberfläche und Authentifizierung&lt;br /&gt;
# `megbes-external` und dessen Containerlog&lt;br /&gt;
# DNS, DynDNS und öffentliches Routing&lt;br /&gt;
# Router, Portweiterleitung und lokale Firewall&lt;br /&gt;
# `megbes-internal` und dessen Anwendungslog&lt;br /&gt;
# UDP-Weg im Ausstellungsnetz&lt;br /&gt;
# Medienstation, Empfängersoftware und konkrete Befehle&lt;br /&gt;
&lt;br /&gt;
Details: [[Routing und Signalweg]].&lt;br /&gt;
&lt;br /&gt;
== Sichere Abbruchpunkte ==&lt;br /&gt;
&lt;br /&gt;
Die Arbeit wird abgebrochen und der letzte bekannte Zustand wiederhergestellt, wenn die Projektzuordnung unklar ist, eine Änderung mehrere Kundencontainer unerwartet betrifft, Geheimwerte fehlen oder nicht eindeutig zugeordnet sind, keine belastbare Sicherung existiert oder sich der bisherige Release nicht bestimmen lässt.&lt;br /&gt;
&lt;br /&gt;
== Nachkontrolle ==&lt;br /&gt;
&lt;br /&gt;
* öffentliche Anwendung erreichbar&lt;br /&gt;
* interner Server erreichbar&lt;br /&gt;
* mindestens ein repräsentativer Steuerbefehl erfolgreich&lt;br /&gt;
* Rückmeldung einer stationsgesteuerten Station erfolgreich&lt;br /&gt;
* keine neue Fehlerserie in den Logs&lt;br /&gt;
* Dokumentation und tatsächlicher Zustand stimmen überein&lt;br /&gt;
&lt;br /&gt;
== Zentraler Server ==&lt;br /&gt;
Der geprüfte Istzustand und das Berechtigungsmodell sind unter [[Zentraler MegBes-Server – Inventur und Administration]] dokumentiert.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Wartung]]&lt;br /&gt;
[[Kategorie:Fehlerdiagnose]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Zentraler_MegBes-Server_%E2%80%93_Inventur_und_Administration&amp;diff=80</id>
		<title>Zentraler MegBes-Server – Inventur und Administration</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Zentraler_MegBes-Server_%E2%80%93_Inventur_und_Administration&amp;diff=80"/>
		<updated>2026-08-07T12:45:01Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Geprüften Ausgangsstand, Berechtigungsmodell und Inventurplan dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Zentraler MegBes-Server – Inventur und Administration =&lt;br /&gt;
&lt;br /&gt;
== Zweck und Status ==&lt;br /&gt;
Diese Seite dokumentiert den geprüften Istzustand, das Berechtigungsmodell und das Inventurverfahren des zentralen MegBes-Servers. Sie ist die technische Grundlage für Wartung, Fehlerdiagnose und das spätere Anlegen neuer Kundencontainer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Stand der Bestandsaufnahme: 7. August 2026.&#039;&#039;&#039; Die erste Übersicht ist geprüft; Mounts, Firewall, Plesk-Proxy-Zuordnungen, Backups und Wiederherstellungswege werden noch vertieft inventarisiert. Vorläufige Beobachtungen sind ausdrücklich als solche gekennzeichnet.&lt;br /&gt;
&lt;br /&gt;
== Serverbasis ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! Geprüfter Stand&lt;br /&gt;
|-&lt;br /&gt;
| Hosting || IONOS-Server mit Plesk&lt;br /&gt;
|-&lt;br /&gt;
| Betriebssystem || Ubuntu 24.04.4 LTS, x86_64&lt;br /&gt;
|-&lt;br /&gt;
| Plesk || Plesk Obsidian 18.0.79.5&lt;br /&gt;
|-&lt;br /&gt;
| Container-Laufzeit || Docker 29.7.2&lt;br /&gt;
|-&lt;br /&gt;
| Arbeitsspeicher || 15,55 GiB für die Container verfügbar&lt;br /&gt;
|-&lt;br /&gt;
| Docker-Netzwerke || Standardnetzwerke `bridge`, `host` und `none`; keine benannten projektspezifischen Netzwerke&lt;br /&gt;
|-&lt;br /&gt;
| Docker-Volumes || Keine benannten Volumes; persistente Daten werden voraussichtlich über Bind-Mounts bereitgestellt und müssen noch geprüft werden&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die öffentliche IP-Adresse, Zugangsdaten und weiteren sicherheitsrelevanten Verbindungsdaten werden nicht auf dieser Seite veröffentlicht. Sie liegen in der geschützten System- beziehungsweise Passwortdokumentation.&lt;br /&gt;
&lt;br /&gt;
== Berechtigungsmodell für Administration ==&lt;br /&gt;
Für automatisierte Prüfung und unterstützte Administration existiert der eigene Serverbenutzer `clawtronics` mit separatem ED25519-Schlüssel.&lt;br /&gt;
&lt;br /&gt;
Der Benutzer:&lt;br /&gt;
&lt;br /&gt;
* besitzt keine Mitgliedschaft in der Gruppe `docker`,&lt;br /&gt;
* besitzt keinen pauschalen Root- oder sudo-Zugang,&lt;br /&gt;
* darf nur ausdrücklich freigegebene, root-eigene Hilfsskripte ohne Passwort ausführen,&lt;br /&gt;
* kann die freigegebenen Skripte selbst nicht verändern,&lt;br /&gt;
* erhält neue Rechte stufenweise und nur für einen dokumentierten Betriebszweck.&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Read-only-Befehl `/usr/local/sbin/megbes-discovery` liefert ausschließlich Plesk-Version, Container, Images, Docker-Netzwerke, Docker-Volumes und eine momentane Ressourcenübersicht. Containeränderungen, `docker exec`, Datenbankzugriffe und Dateisystemänderungen sind nicht freigegeben.&lt;br /&gt;
&lt;br /&gt;
Die Gruppe `docker` wird nicht vergeben, da deren Mitgliedschaft praktisch Root-Rechte ermöglicht. Erweiterungen werden als eng begrenzte, root-eigene Hilfsskripte umgesetzt.&lt;br /&gt;
&lt;br /&gt;
== Aktueller Containerbestand ==&lt;br /&gt;
Zum Prüfzeitpunkt liefen 13 Container ohne sichtbare Neustartschleife.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Container !! Image beziehungsweise Release !! Hostbindung !! Aufgabe&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-status` || `tinetronics/megbes-status:AUGUST-2026-2-RELEASE` || alle IPv4-Schnittstellen, Port 9990 || zentraler [[Status-Monitor]]&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-tine` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32770 || Kundenprojekt Tine&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-limes` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32780 || Kundenprojekt Limes&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-gkp` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32769 || Kundenprojekt GKP&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-bayam` || `MARCH-2026-1-RELEASE` || nur localhost, Port 32768 || Kundenprojekt BayAM&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-miqua` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32779 || Kundenprojekt MiQua&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-messe` || `MARCH-2026-1-RELEASE` || alle IPv4- und IPv6-Schnittstellen, Port 32771 || Kundenprojekt Messe&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-hon` || `MARCH-2026-1-RELEASE` || nur localhost, Port 9997 || Kundenprojekt HoN&lt;br /&gt;
|-&lt;br /&gt;
| `mediawiki` || `mediawiki:latest` || nur localhost, Port 49155 || internes MegBes-Wiki&lt;br /&gt;
|-&lt;br /&gt;
| `mongodb` || `mongo:7.0.12` || alle IPv4-Schnittstellen, Port 49154 || zentrale MongoDB&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-nowalux` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 34615 || Kundenprojekt NowaLux&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-miquaguide` || `MARCH-2026-1-RELEASE` || alle IPv4- und IPv6-Schnittstellen, Port 32774 || Kundenprojekt MiQua Guide&lt;br /&gt;
|-&lt;br /&gt;
| `megbes-external-gse` || `MARCH-2026-1-RELEASE` || alle IPv4-Schnittstellen, Port 32805 || Kundenprojekt GSE&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Hostbindung zeigt, an welchen Schnittstellen Docker lauscht. Sie beweist allein noch keine Erreichbarkeit aus dem Internet; dafür müssen zusätzlich Plesk-, Firewall- und Providerregeln geprüft werden.&lt;br /&gt;
&lt;br /&gt;
== Erste Betriebsbeobachtungen ==&lt;br /&gt;
* Alle 13 Container liefen zum Prüfzeitpunkt seit rund sechs Stunden.&lt;br /&gt;
* Die momentane CPU- und Speicherauslastung war unauffällig.&lt;br /&gt;
* Der Status-Monitor nutzt den derzeit bekannten aktuellen Release `AUGUST-2026-2-RELEASE`.&lt;br /&gt;
* Die zehn Kundencontainer von `megbes-external` verwenden `MARCH-2026-1-RELEASE`, obwohl das Image `AUGUST-2026-1-RELEASE` lokal vorhanden ist. Daraus folgt kein automatischer Updateauftrag; Freigabe, Kompatibilität und Rückkehrweg sind projektweise zu prüfen.&lt;br /&gt;
* MediaWiki sowie BayAM und HoN sind nur an localhost gebunden.&lt;br /&gt;
* Die Bindung von MongoDB an alle IPv4-Schnittstellen ist sicherheitsrelevant und muss gegen Firewall, Authentisierung und tatsächlichen Verwendungszweck geprüft werden.&lt;br /&gt;
* Mehrere MegBes-Ports sind an alle Schnittstellen gebunden. Ob dies erforderlich ist oder Plesk als lokaler Reverse Proxy genügt, wird projektweise geprüft.&lt;br /&gt;
&lt;br /&gt;
== Inventurplan ==&lt;br /&gt;
Die folgenden Punkte werden ausschließlich lesend aufgenommen, bevor Betriebsänderungen erfolgen:&lt;br /&gt;
&lt;br /&gt;
# Container-Mounts, Datenpfade und Eigentümer&lt;br /&gt;
# Restart-Policies, Healthchecks und Ressourcenbegrenzungen&lt;br /&gt;
# Plesk-Domains, Reverse-Proxy-Ziele und Zertifikatszuordnungen&lt;br /&gt;
# Host-Firewall und tatsächlich öffentlich erreichbare Ports&lt;br /&gt;
# MongoDB-Authentisierung und Netzwerkbindung, ohne Geheimwerte auszugeben&lt;br /&gt;
# Ablage und Sicherung der MongoDB- und MediaWiki-Daten&lt;br /&gt;
# Backup-Zeitpläne, Aufbewahrung und vorhandene Wiederherstellungstests&lt;br /&gt;
# freier Speicherplatz, Logwachstum und Docker-Datennutzung&lt;br /&gt;
# Herkunft und Startparameter jedes Containers&lt;br /&gt;
# standardisierter Ablauf für Update, Rollback und neuen Kundencontainer&lt;br /&gt;
&lt;br /&gt;
== Regeln für Änderungen ==&lt;br /&gt;
* Vor jeder Änderung werden betroffene Container, Konfiguration, Mounts, Ports und aktueller Image-Stand gesichert beziehungsweise dokumentiert.&lt;br /&gt;
* Geheimwerte werden weder in Befehlsausgaben noch im Wiki gespeichert.&lt;br /&gt;
* Ein Container wird nur mit bekanntem Rückkehrweg ersetzt.&lt;br /&gt;
* Datenbank- und Volume-Änderungen erfolgen erst nach geprüfter Sicherung.&lt;br /&gt;
* Neustarts, Updates und neue Kundencontainer benötigen einen ausdrücklichen Auftrag.&lt;br /&gt;
* Nach Änderungen werden Anwendung, Logs, Status-Monitor und mindestens ein kontrollierter Projektablauf geprüft.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Megbes-external unter Plesk]] und [[Wartung, Backups und Fehlerdiagnose]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;br /&gt;
[[Kategorie:Plesk]]&lt;br /&gt;
[[Kategorie:Wartung]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=DynDNS_und_Router&amp;diff=79</id>
		<title>DynDNS und Router</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=DynDNS_und_Router&amp;diff=79"/>
		<updated>2026-08-07T10:06:26Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: FRITZ!Box-Sicherheitscheckliste verknüpft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DynDNS und Router =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
`megbes-external` benötigt eine dauerhaft auflösbare Adresse und eine kontrollierte Weiterleitung zum lokalen `megbes-internal`. Bevorzugt wird IONOS DynDNS; No-IP bleibt eine Bestands- oder Ausweichlösung.&lt;br /&gt;
&lt;br /&gt;
== Planungswerte ==&lt;br /&gt;
* DynDNS-Hostname&lt;br /&gt;
* interner Server mit fester lokaler IP&lt;br /&gt;
* externer und interner TCP-Port&lt;br /&gt;
* Routermodell und zuständige Administration&lt;br /&gt;
* Sicherheitsmodus und Zertifikatszuordnung&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
# DynDNS-Namen projektspezifisch anlegen; geheime Update-URL ausschließlich im Passwortmanager speichern.&lt;br /&gt;
# Aktualisierungsmechanismus auf Router oder einem dauerhaft laufenden System einrichten.&lt;br /&gt;
# DNS-Auflösung von einem externen Anschluss prüfen.&lt;br /&gt;
# Am Router nur den benötigten TCP-Port auf die feste IP von `megbes-internal` weiterleiten.&lt;br /&gt;
# Keine DMZ-/Exposed-Host-Freigabe verwenden.&lt;br /&gt;
# Lokale und serverseitige Firewall prüfen.&lt;br /&gt;
# Verbindung von `megbes-external` bis `megbes-internal` mit Zertifikat testen.&lt;br /&gt;
&lt;br /&gt;
 nslookup &amp;lt;DynDNS-Hostname&amp;gt;&lt;br /&gt;
 sudo ss -lntup&lt;br /&gt;
&lt;br /&gt;
Eine Portprüfung aus dem internen Netz kann wegen fehlendem NAT-Loopback irreführend sein; extern testen.&lt;br /&gt;
&lt;br /&gt;
== FRITZ!Box ==&lt;br /&gt;
Die allgemeine Einrichtung, Absicherung und Abnahme ist unter [[FRITZ!Box konfigurieren und absichern]] beschrieben.&lt;br /&gt;
Unter Internet → Freigaben das Gerät anhand seiner festen IP auswählen und eine einzelne Portfreigabe für den projektspezifischen TCP-Port anlegen. Automatische Freigaben deaktiviert lassen, sofern sie nicht ausdrücklich benötigt werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fehlerbild !! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Hostname zeigt auf alte Adresse || DynDNS-Aktualisierung und öffentliche IP vergleichen&lt;br /&gt;
|-&lt;br /&gt;
| Port extern geschlossen || Routerfreigabe, Ziel-IP, Firewall und laufenden Container prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Verbindung erreicht falsches Projekt || Zielport und Containerzuordnung sofort korrigieren&lt;br /&gt;
|-&lt;br /&gt;
| TLS-Fehler || [[Zertifikate|Zertifikat]], Hostname und Vertrauenskette prüfen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
Hostname, Routermodell, Portzuordnung, Ziel-IP, Änderungsdatum und Testergebnis auf der Projektseite festhalten. Update-URLs, Zugangsdaten und Schlüssel bleiben geheim.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Netzwerk]]&lt;br /&gt;
[[Kategorie:DynDNS]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=FRITZ!Box_konfigurieren_und_absichern&amp;diff=78</id>
		<title>FRITZ!Box konfigurieren und absichern</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=FRITZ!Box_konfigurieren_und_absichern&amp;diff=78"/>
		<updated>2026-08-07T10:06:26Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Allgemeine Sicherheits- und Fernzugriffscheckliste für jede FRITZ!Box angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= FRITZ!Box konfigurieren und absichern =&lt;br /&gt;
&lt;br /&gt;
== Zweck und Grundsatz ==&lt;br /&gt;
Diese Checkliste gilt für jede von tinetronics betreute FRITZ!Box. Sie reduziert unnötige Angriffsflächen und stellt zugleich sicher, dass im Störungsfall ein dokumentierter Fernzugang vorhanden ist.&lt;br /&gt;
&lt;br /&gt;
Der normale administrative Fernzugriff erfolgt über ein VPN, vorzugsweise WireGuard. MyFRITZ! oder ein eigener DynDNS-Name stellt lediglich die Erreichbarkeit unter einem festen Namen her und ist für sich allein noch kein sicherer Administrationsweg.&lt;br /&gt;
&lt;br /&gt;
Ein direkter HTTPS-Zugriff auf die FRITZ!Box darf als unabhängiger Notzugang bestehen bleiben, wenn das Projekt dies erfordert. Er ist öffentlich erreichbar und muss deshalb ausdrücklich dokumentiert und zusätzlich abgesichert werden.&lt;br /&gt;
&lt;br /&gt;
== Verbindliche Basiseinstellungen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bereich !! Einstellung oder Maßnahme !! Vorgabe&lt;br /&gt;
|-&lt;br /&gt;
| FRITZ!OS || Update-Einstellung || Automatische Updates aktivieren und verfügbare Sicherheitsupdates zeitnah installieren.&lt;br /&gt;
|-&lt;br /&gt;
| Administration || Benutzerkonten || Für jede administrierende Person ein eigenes Konto verwenden; keine gemeinsam genutzten Standardkonten.&lt;br /&gt;
|-&lt;br /&gt;
| Kennwörter || Konten und WLAN || Jeweils lange, einzigartige Kennwörter aus dem Passwortmanager verwenden. Kennwörter nicht in Projektseiten, E-Mails oder unverschlüsselten Dateien ablegen.&lt;br /&gt;
|-&lt;br /&gt;
| Berechtigungen || Minimale Rechte || Nur tatsächlich benötigte Rechte vergeben. Insbesondere NAS-, Smart-Home- und Telefonie-Rechte nicht vorsorglich aktivieren.&lt;br /&gt;
|-&lt;br /&gt;
| Fernzugriff || Normalweg || VPN, vorzugsweise WireGuard, einrichten und von einem externen Anschluss testen.&lt;br /&gt;
|-&lt;br /&gt;
| Internetfreigaben || Portfreigaben || Nur projektspezifisch benötigte Ports freigeben. Keine DMZ-/Exposed-Host-Freigabe und keine selbstständigen Portfreigaben über UPnP zulassen, sofern nicht ausdrücklich begründet.&lt;br /&gt;
|-&lt;br /&gt;
| WLAN || Verschlüsselung || WPA3 beziehungsweise WPA2/WPA3 verwenden; WEP und unverschlüsseltes WLAN nicht verwenden. Gastnetz vom internen Netz trennen.&lt;br /&gt;
|-&lt;br /&gt;
| Überwachung || Ereignisse und Push Service || Ereignisprotokoll regelmäßig kontrollieren. Push Service für wichtige Systemereignisse und Änderungen einrichten, sofern ein geeignetes Funktionspostfach verfügbar ist.&lt;br /&gt;
|-&lt;br /&gt;
| Sicherung || Konfiguration || Nach wesentlichen Änderungen eine verschlüsselte Sicherungsdatei erzeugen und geschützt ablegen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VPN als Standardzugang ==&lt;br /&gt;
# Unter Internet → Freigaben → VPN (WireGuard) einen separaten Zugang für das zuständige Administrationsgerät oder die zuständige Person einrichten.&lt;br /&gt;
# VPN-Konfiguration und privaten Schlüssel ausschließlich geschützt übertragen und speichern.&lt;br /&gt;
# Zugriff von einem Anschluss außerhalb des Zielnetzes testen.&lt;br /&gt;
# Prüfen, ob die FRITZ!Box-Oberfläche und die benötigten internen Systeme über das VPN erreichbar sind.&lt;br /&gt;
# Nicht mehr verwendete VPN-Verbindungen löschen.&lt;br /&gt;
&lt;br /&gt;
VPN-Zugänge sollen nach Möglichkeit nicht zwischen mehreren Personen oder Geräten geteilt werden. So kann ein verlorenes Gerät gezielt gesperrt werden.&lt;br /&gt;
&lt;br /&gt;
== Optionaler HTTPS-Notzugang ==&lt;br /&gt;
Die Einstellungen „Internetzugriff auf die FRITZ!Box über HTTPS aktiviert“ und „Zugang aus dem Internet erlaubt“ werden grundsätzlich nicht für den Normalbetrieb benötigt. Wenn ein vom VPN unabhängiger Notzugang betrieblich sinnvoll ist, dürfen sie bewusst aktiviert bleiben.&lt;br /&gt;
&lt;br /&gt;
Für diesen Fall gelten zusätzlich folgende Maßnahmen:&lt;br /&gt;
&lt;br /&gt;
# Ein eigenes FRITZ!Box-Benutzerkonto nur für den Notzugang anlegen.&lt;br /&gt;
# Ein langes, einzigartiges Kennwort verwenden; keine Wiederverwendung eines WLAN-, MyFRITZ!- oder Projektkennworts.&lt;br /&gt;
# Nur die zur Administration benötigte Berechtigung vergeben. NAS- und weitere Zusatzrechte deaktiviert lassen.&lt;br /&gt;
# Eine von FRITZ!OS angebotene zusätzliche Bestätigung beziehungsweise Zwei-Faktor-Funktion aktivieren, soweit sie für den betreffenden Zugriff unterstützt wird.&lt;br /&gt;
# MyFRITZ!- oder DynDNS-Adresse nicht öffentlich dokumentieren. Adresse und Zugangsdaten getrennt und nur im Passwortmanager ablegen.&lt;br /&gt;
# Erfolgreiche und fehlgeschlagene Anmeldungen unter System → Ereignisse kontrollieren; Auffälligkeiten sofort untersuchen.&lt;br /&gt;
# Nicht mehr benötigte Benutzer sowie alte Geräte- und VPN-Zugänge zeitnah entfernen.&lt;br /&gt;
# Den Notzugang mindestens einmal jährlich und nach jedem Routerwechsel von extern testen.&lt;br /&gt;
&lt;br /&gt;
Falls kein unabhängiger Notzugang benötigt wird, sind sowohl der HTTPS-Internetzugriff als auch „Zugang aus dem Internet erlaubt“ zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== MyFRITZ! und DynDNS ==&lt;br /&gt;
MyFRITZ! und DynDNS lösen einen wechselnden Internetanschluss auf einen festen Namen auf. Sie öffnen nicht automatisch die FRITZ!Box-Oberfläche. Das Risiko entsteht durch einen tatsächlich aus dem Internet erreichbaren Dienst, beispielsweise den aktivierten HTTPS-Fernzugriff oder eine Portfreigabe.&lt;br /&gt;
&lt;br /&gt;
Für MegBes gelten ergänzend die Hinweise unter [[DynDNS und Router]]. Geheime DynDNS-Update-URLs gehören ausschließlich in den Passwortmanager.&lt;br /&gt;
&lt;br /&gt;
== Portfreigaben für Projekt-Dienste ==&lt;br /&gt;
# Zielgerät erhält eine feste lokale IP-Adresse beziehungsweise eine feste DHCP-Zuordnung.&lt;br /&gt;
# Nur Protokoll und Port freigeben, die der konkrete Dienst benötigt.&lt;br /&gt;
# Automatische Freigaben deaktiviert lassen.&lt;br /&gt;
# Dienst selbst mit Authentisierung und Transportverschlüsselung absichern; eine Portfreigabe ersetzt keine Anwendungssicherheit.&lt;br /&gt;
# Erreichbarkeit und Zertifikat von einem externen Anschluss prüfen.&lt;br /&gt;
# Nach Projektende nicht mehr benötigte Freigaben löschen.&lt;br /&gt;
&lt;br /&gt;
== Abnahme und regelmäßige Kontrolle ==&lt;br /&gt;
Nach Einrichtung oder Änderung sind mindestens folgende Punkte zu prüfen:&lt;br /&gt;
&lt;br /&gt;
* FRITZ!OS ist aktuell und automatische Updates sind aktiviert.&lt;br /&gt;
* VPN funktioniert von außerhalb des Standortnetzes.&lt;br /&gt;
* Der HTTPS-Notzugang ist entweder nachweislich deaktiviert oder als bewusste Ausnahme dokumentiert und getestet.&lt;br /&gt;
* Es existieren keine unbekannten Benutzer, VPN-Zugänge oder automatischen Portfreigaben.&lt;br /&gt;
* Jede Portfreigabe besitzt einen nachvollziehbaren Projektzweck und zeigt auf das richtige Zielgerät.&lt;br /&gt;
* Push Service beziehungsweise Ereignisprotokoll ist funktionsfähig und enthält keine unerklärten Anmeldungen.&lt;br /&gt;
* Eine aktuelle, verschlüsselte Konfigurationssicherung ist vorhanden.&lt;br /&gt;
&lt;br /&gt;
== Projektdokumentation ==&lt;br /&gt;
Auf der jeweiligen Projektseite beziehungsweise im dafür vorgesehenen geschützten System festhalten:&lt;br /&gt;
&lt;br /&gt;
* FRITZ!Box-Modell, Standort und FRITZ!OS-Version&lt;br /&gt;
* Zuständigkeit und Datum der letzten Prüfung&lt;br /&gt;
* verwendeter DynDNS-/MyFRITZ!-Dienst, jedoch keine geheimen Update-URLs&lt;br /&gt;
* eingerichtete VPN-Zugänge beziehungsweise verantwortliche Geräte&lt;br /&gt;
* Entscheidung, ob der HTTPS-Notzugang aktiviert ist, einschließlich Begründung&lt;br /&gt;
* alle Portfreigaben mit Zweck, Protokoll, externem Port, Ziel-IP und internem Port&lt;br /&gt;
* Ablageort der verschlüsselten Konfigurationssicherung&lt;br /&gt;
&lt;br /&gt;
Kennwörter, private VPN-Schlüssel, Wiederherstellungscodes und geheime Update-URLs dürfen nicht im Wiki stehen.&lt;br /&gt;
&lt;br /&gt;
== Weiterführende Hinweise ==&lt;br /&gt;
* [https://avm.de/service/ AVM-Service und modellspezifische Wissensdatenbank]&lt;br /&gt;
* [https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/Broschueren/Wegweiser_Checklisten_Flyer/Brosch_A6_Internet_der_Dinge.pdf?__blob=publicationFile BSI: Das Internet der Dinge sicher nutzen]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Netzwerk]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Zertifikate&amp;diff=77</id>
		<title>Zertifikate</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Zertifikate&amp;diff=77"/>
		<updated>2026-08-06T20:57:54Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Zertifikatsverwaltung mit Status-Monitor-Seite verknüpft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Zertifikate =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
MegBes kann die Verbindung zwischen `megbes-external`, Status-Monitor und `megbes-internal` mit Client-Zertifikaten absichern. Zertifikate identifizieren einen berechtigten Client; der zugehörige private Schlüssel muss geschützt bleiben.&lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| Zertifikat || Öffentlicher Identitätsnachweis des Clients.&lt;br /&gt;
|-&lt;br /&gt;
| privater Schlüssel || Geheimer Schlüssel; darf nicht ins Wiki oder in ungeschützte Ablagen gelangen.&lt;br /&gt;
|-&lt;br /&gt;
| Keystore || Datei, die Zertifikat und privaten Schlüssel für eine Anwendung bereitstellen kann.&lt;br /&gt;
|-&lt;br /&gt;
| Keystore-Passwort || Geheimwert zum Schutz des Keystores.&lt;br /&gt;
|-&lt;br /&gt;
| Vertrauenskonfiguration || Legt fest, welchen Gegenstellen beziehungsweise Ausstellern vertraut wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Erstellung über den [[Status-Monitor]] ==&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Status-Monitor enthält Funktionen zum Erstellen, Anzeigen, Installieren und Löschen von Zertifikaten. Die Oberfläche soll bevorzugt verwendet werden, weil sie die projektspezifische Zuordnung nachvollziehbar hält.&lt;br /&gt;
&lt;br /&gt;
# Im Status-Monitor mit einem berechtigten Administrationskonto anmelden.&lt;br /&gt;
# Zertifikatsbereich öffnen und das korrekte Projekt auswählen.&lt;br /&gt;
# Neues Zertifikat mit einer eindeutigen, projektbezogenen Bezeichnung erstellen.&lt;br /&gt;
# Erzeugte Dateien unmittelbar in der vorgesehenen geschützten Ablage sichern.&lt;br /&gt;
# Zertifikat beziehungsweise Keystore der vorgesehenen MegBes-Komponente zuordnen.&lt;br /&gt;
# Anwendung kontrolliert neu starten und das Startprotokoll prüfen.&lt;br /&gt;
# Verbindung zwischen externer und interner Komponente testen.&lt;br /&gt;
# Bezeichnung, Einsatzzweck, Gültigkeitszeitraum und Ablageort ohne Geheimwerte auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Funktionsprüfung ==&lt;br /&gt;
&lt;br /&gt;
* Die beteiligten Anwendungen starten ohne Keystore- oder TLS-Fehler.&lt;br /&gt;
* Der vorgesehene Client kann den geschützten Endpunkt erreichen.&lt;br /&gt;
* Ein nicht autorisierter Aufruf wird abgewiesen.&lt;br /&gt;
* Das eingesetzte Zertifikat ist dem richtigen Projekt zugeordnet und noch gültig.&lt;br /&gt;
&lt;br /&gt;
== Erneuerung ==&lt;br /&gt;
&lt;br /&gt;
Zertifikate sollen vor Ablauf erneuert werden. Das neue Zertifikat wird bereitgestellt und getestet, bevor das alte entfernt wird. Bei einer Störung muss der vorherige Zustand wiederherstellbar bleiben.&lt;br /&gt;
&lt;br /&gt;
== Typische Fehler ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fehlerbild&lt;br /&gt;
! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Anwendung startet nicht || Keystore-Pfad, Dateirechte, Passwortzuordnung und Dateiformat prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| TLS-Verbindung wird abgelehnt || Gültigkeit, Client-Zuordnung und Vertrauenskette prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Falsches Projekt betroffen || Zertifikatsbezeichnung und Container-/Projektzuordnung prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Funktion endet nach Zertifikatswechsel || Altes Zertifikat nicht löschen; zunächst Konfiguration zurücksetzen und Logs vergleichen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sicherheitsregeln ==&lt;br /&gt;
&lt;br /&gt;
* Private Schlüssel und Keystore-Passwörter niemals ins Wiki kopieren.&lt;br /&gt;
* Zertifikatsdateien nicht über ungeschützte Kommunikationswege übertragen.&lt;br /&gt;
* Keine produktiven Zertifikate in Beispielkonfigurationen oder öffentliche Repositories übernehmen.&lt;br /&gt;
* Verlust oder vermutete Offenlegung als Sicherheitsvorfall behandeln und das Zertifikat ersetzen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Wartung,_Backups_und_Fehlerdiagnose&amp;diff=76</id>
		<title>Wartung, Backups und Fehlerdiagnose</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Wartung,_Backups_und_Fehlerdiagnose&amp;diff=76"/>
		<updated>2026-08-06T20:57:54Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Status-Monitor in Wartungsablauf eingebunden&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wartung, Backups und Fehlerdiagnose =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
Regelmäßige Wartung hält zentrale und lokale MegBes-Komponenten sicher, nachvollziehbar und wiederherstellbar. Änderungen erfolgen projektweise und mit dokumentiertem Rückkehrweg.&lt;br /&gt;
&lt;br /&gt;
== Status-Monitor ==&lt;br /&gt;
&lt;br /&gt;
Der zentrale [[Status-Monitor]] unter [https://status.megbes.de status.megbes.de] zeigt die Health-Zustände der konfigurierten External- und Internal-Instanzen. Ein grüner Status bestätigt die Erreichbarkeit des jeweiligen Management-Endpunkts, aber nicht automatisch den vollständigen Signalweg bis zur Medienstation.&lt;br /&gt;
&lt;br /&gt;
== Regelmäßige Kontrollen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bereich&lt;br /&gt;
! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Container || Laufzustand, Neustarts und aktuelle Fehler im Log&lt;br /&gt;
|-&lt;br /&gt;
| Betriebssystem || verfügbare Sicherheitsaktualisierungen und freier Speicherplatz&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerk || Erreichbarkeit, DynDNS-Auflösung und Routerweiterleitung&lt;br /&gt;
|-&lt;br /&gt;
| Zertifikate || Gültigkeitsende und korrekte Projektzuordnung&lt;br /&gt;
|-&lt;br /&gt;
| MegBes-Release || installierter Stand gegenüber freigegebenem Stand&lt;br /&gt;
|-&lt;br /&gt;
| Medienstationen || Erreichbarkeit, Rückmeldungen und automatischer Wiederanlauf&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation || Übereinstimmung von Projektseite und tatsächlichem System&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vor einer Änderung sichern ==&lt;br /&gt;
&lt;br /&gt;
Zu erfassen beziehungsweise zu sichern sind mindestens:&lt;br /&gt;
&lt;br /&gt;
* projektspezifische Konfiguration ohne ungeschützte Weitergabe von Geheimwerten&lt;br /&gt;
* Containerdefinition, Portzuordnungen und Dateimounts&lt;br /&gt;
* aktuell eingesetzter MegBes-Release&lt;br /&gt;
* Zertifikats- und Keystore-Dateien in geschützter Ablage&lt;br /&gt;
* kundenspezifische Skripte und Stationssoftware&lt;br /&gt;
* für Raspberry-Pi-Stationen gegebenenfalls ein geprüftes SD-Karten-Abbild&lt;br /&gt;
* Datum, Anlass und verantwortliche Person der Sicherung&lt;br /&gt;
&lt;br /&gt;
Eine Sicherung gilt erst als belastbar, wenn Ablageort, Lesbarkeit und vorgesehener Wiederherstellungsweg geprüft wurden.&lt;br /&gt;
&lt;br /&gt;
== Sicherer Wartungsablauf ==&lt;br /&gt;
&lt;br /&gt;
# Istzustand und konkrete Störung beziehungsweise Wartungsaufgabe dokumentieren.&lt;br /&gt;
# Projektbezogene Konfiguration und Release feststellen.&lt;br /&gt;
# Rückkehrweg und benötigte Sicherungen vorbereiten.&lt;br /&gt;
# Änderung nur an einer klar abgegrenzten Stufe durchführen.&lt;br /&gt;
# Logs und unmittelbare Erfolgskriterien prüfen.&lt;br /&gt;
# Gesamten Signalweg mit einem kontrollierten Test durchlaufen.&lt;br /&gt;
# Stationszustände und Wiederanlauf prüfen.&lt;br /&gt;
# Ergebnis und neuen Istzustand auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose nach Ebenen ==&lt;br /&gt;
&lt;br /&gt;
# Bedienoberfläche und Authentifizierung&lt;br /&gt;
# `megbes-external` und dessen Containerlog&lt;br /&gt;
# DNS, DynDNS und öffentliches Routing&lt;br /&gt;
# Router, Portweiterleitung und lokale Firewall&lt;br /&gt;
# `megbes-internal` und dessen Anwendungslog&lt;br /&gt;
# UDP-Weg im Ausstellungsnetz&lt;br /&gt;
# Medienstation, Empfängersoftware und konkrete Befehle&lt;br /&gt;
&lt;br /&gt;
Details: [[Routing und Signalweg]].&lt;br /&gt;
&lt;br /&gt;
== Sichere Abbruchpunkte ==&lt;br /&gt;
&lt;br /&gt;
Die Arbeit wird abgebrochen und der letzte bekannte Zustand wiederhergestellt, wenn die Projektzuordnung unklar ist, eine Änderung mehrere Kundencontainer unerwartet betrifft, Geheimwerte fehlen oder nicht eindeutig zugeordnet sind, keine belastbare Sicherung existiert oder sich der bisherige Release nicht bestimmen lässt.&lt;br /&gt;
&lt;br /&gt;
== Nachkontrolle ==&lt;br /&gt;
&lt;br /&gt;
* öffentliche Anwendung erreichbar&lt;br /&gt;
* interner Server erreichbar&lt;br /&gt;
* mindestens ein repräsentativer Steuerbefehl erfolgreich&lt;br /&gt;
* Rückmeldung einer stationsgesteuerten Station erfolgreich&lt;br /&gt;
* keine neue Fehlerserie in den Logs&lt;br /&gt;
* Dokumentation und tatsächlicher Zustand stimmen überein&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Wartung]]&lt;br /&gt;
[[Kategorie:Fehlerdiagnose]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Softwaremodule&amp;diff=75</id>
		<title>Softwaremodule</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Softwaremodule&amp;diff=75"/>
		<updated>2026-08-06T20:57:54Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Status-Modul mit ausführlicher Status-Monitor-Seite verknüpft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Softwaremodule =&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Quellcode von MegBes ist als Maven-Projekt mit mehreren Modulen aufgebaut. Der maßgebliche Stand befindet sich im privaten Repository `tinetronics/megbes`.&lt;br /&gt;
&lt;br /&gt;
== common ==&lt;br /&gt;
&lt;br /&gt;
Gemeinsam verwendete Datenmodelle, Konfigurationsklassen, Logging-, Mail-, Zertifikats- und Sicherheitsfunktionen. Dieses Modul wird von mehreren Diensten verwendet.&lt;br /&gt;
&lt;br /&gt;
== external ==&lt;br /&gt;
&lt;br /&gt;
Implementiert `megbes-external`. Das Modul stellt die zentralen HTTP-Endpunkte bereit, übernimmt Authentifizierung und Benutzer-/Stationslogik und kommuniziert mit dem projektspezifischen `megbes-internal`.&lt;br /&gt;
&lt;br /&gt;
== internal ==&lt;br /&gt;
&lt;br /&gt;
Implementiert `megbes-internal`. Das Modul nimmt Aufrufe von `megbes-external` entgegen, verwaltet bei Bedarf Stationszustände und sendet die eigentlichen UDP-Signale in das lokale Ausstellungsnetz.&lt;br /&gt;
&lt;br /&gt;
== client ==&lt;br /&gt;
&lt;br /&gt;
Enthält die statischen Web-Oberflächen und JavaScript-Dateien für Anmeldung, Ticketdarstellung, Hub und Stationsbedienung. Es existieren Varianten mit und ohne Authentifizierung sowie für stationsgesteuerte Projekte.&lt;br /&gt;
&lt;br /&gt;
== [[Status-Monitor|status]] ==&lt;br /&gt;
&lt;br /&gt;
Implementiert den Status-Monitor. Zu den erkennbaren Funktionen gehören:&lt;br /&gt;
&lt;br /&gt;
* Status- und Verbindungstests&lt;br /&gt;
* Anzeige interner Aufrufprotokolle&lt;br /&gt;
* Erstellung, Installation, Download und Löschung von Zertifikaten&lt;br /&gt;
* Ver- und Entschlüsselungswerkzeuge für Konfigurationswerte&lt;br /&gt;
* Aktivierung und Deaktivierung bestimmter Mail-Informationen&lt;br /&gt;
&lt;br /&gt;
== utils ==&lt;br /&gt;
&lt;br /&gt;
Enthält kleine Hilfsprogramme zum Senden von UDP-Testsignalen für `init`, `idle`, `touchscreen` und `open`.&lt;br /&gt;
&lt;br /&gt;
== release-builder ==&lt;br /&gt;
&lt;br /&gt;
Hilfsmodul zur Erstellung der Releases.&lt;br /&gt;
&lt;br /&gt;
== Build und Veröffentlichung ==&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Build verwendet Java 25 und GitHub Actions. Bei Änderungen am Branch `master` werden die Module gebaut und Snapshot-Docker-Images für `megbes-external`, `megbes-internal` und den Status-Monitor veröffentlicht. Produktive Releases werden gesondert versioniert; die Historie steht in `version.txt`.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Software]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Hauptseite&amp;diff=74</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Hauptseite&amp;diff=74"/>
		<updated>2026-08-06T20:57:54Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Status-Monitor in Einrichtung und Betrieb verlinkt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
= MegBes-Wiki =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MegBes&#039;&#039;&#039; ist ein System zur Steuerung von Medienstationen und anderen Geräten in Ausstellungen. Es kann grundsätzlich alle Geräte ansprechen, die UDP-Signale direkt empfangen oder über eine geeignete Schnittstelle umsetzen können, beispielsweise BrightSign-Player, PCs und Raspberry Pis.&lt;br /&gt;
&lt;br /&gt;
== Systemüberblick ==&lt;br /&gt;
&lt;br /&gt;
Der typische Signalweg lautet:&lt;br /&gt;
&lt;br /&gt;
 Web-Frontend oder App → megbes-external → megbes-internal → UDP → Medienstation&lt;br /&gt;
&lt;br /&gt;
* [[Architektur|Architektur und Signalweg]]&lt;br /&gt;
* [[Komponenten|Komponenten des Systems]]&lt;br /&gt;
* [[Betrieb und Releases|Betrieb, Ubuntu und Releases]]&lt;br /&gt;
* [[Projektübersicht|Aktive Projekte]]&lt;br /&gt;
* [[Sicherheit|Sicherheits- und Dokumentationsregeln]]&lt;br /&gt;
&lt;br /&gt;
== Einrichtung und Betrieb ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Neukunde|Neukunde / neues Projekt]]&lt;br /&gt;
* [[Megbes-internal|megbes-internal installieren und starten]]&lt;br /&gt;
* [[Ubuntu aktualisieren|Ubuntu regelmäßig aktualisieren]]&lt;br /&gt;
* [[Ubuntu-LTS-Upgrade|Ubuntu auf die nächste LTS-Version aktualisieren]]&lt;br /&gt;
* [[Feste IP-Adresse unter Ubuntu|feste IP-Adresse unter Ubuntu]]&lt;br /&gt;
* [[Docker installieren|Docker auf Ubuntu installieren]]&lt;br /&gt;
* [[Megbes-external unter Plesk|Konfiguration von megbes-external unter Plesk]]&lt;br /&gt;
* [[Routing und Signalweg|Netzwerk, Routing und DynDNS]]&lt;br /&gt;
* [[Zertifikate]]&lt;br /&gt;
* [[Ausstellungshardware|Medienstationen und Ausstellungshardware]]&lt;br /&gt;
* [[Wartung, Backups und Fehlerdiagnose]]&lt;br /&gt;
* [[Status-Monitor|Status-Monitor und Systemüberwachung]]&lt;br /&gt;
* [[Umgebungsdatei env.list|Umgebungsdatei env.list]]&lt;br /&gt;
* [[Ubuntu installieren]]&lt;br /&gt;
* [[DynDNS und Router]]&lt;br /&gt;
&lt;br /&gt;
== Aktueller Release-Stand ==&lt;br /&gt;
&lt;br /&gt;
Der aktuellste bekannte Release ist &#039;&#039;&#039;AUGUST-2026-2-RELEASE&#039;&#039;&#039;. Nicht alle Projekte verwenden bereits diesen Stand. Der tatsächlich installierte Release wird deshalb je Projekt dokumentiert. Maßgebliche technische Quelle ist das private GitHub-Repository [https://github.com/tinetronics/megbes tinetronics/megbes].&lt;br /&gt;
&lt;br /&gt;
== Wichtiger Hinweis ==&lt;br /&gt;
&lt;br /&gt;
Passwörter, Tokens, private Schlüssel, vollständige Zugangsdaten und geheime Update-URLs dürfen nicht im Wiki gespeichert werden. Siehe [[Sicherheit]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
&lt;br /&gt;
== Technische Referenz ==&lt;br /&gt;
&lt;br /&gt;
* [[Softwaremodule|Softwaremodule und Build]]&lt;br /&gt;
* [[Konfiguration|Projektkonfiguration]]&lt;br /&gt;
* [[UDP und Stationszustände|UDP und Stationszustände]]&lt;br /&gt;
* [[Client-Feedback und Stationsmeldungen]]&lt;br /&gt;
* [[Bedienung und Authentifizierung]]&lt;br /&gt;
* [[Web-Frontend]]&lt;br /&gt;
* [[Stationsseitige Diagnose]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Status-Monitor&amp;diff=73</id>
		<title>Status-Monitor</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Status-Monitor&amp;diff=73"/>
		<updated>2026-08-06T20:57:53Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Status-Monitor aus dem aktuellen status-Modul dokumentiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Status-Monitor =&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;&#039;MegBes-Status-Monitor&#039;&#039;&#039; ist unter [https://status.megbes.de status.megbes.de] erreichbar. Technisch ist er eine eigenständig betriebene Spring-Boot-Anwendung, fachlich und im Quellcode aber Bestandteil des MegBes-Systems. Im Maven-Multi-Modul-Projekt wird er als Modul &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt; gebaut; das Artefakt heißt &amp;lt;code&amp;gt;megbes-status&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der Status-Monitor ist eine interne Betriebs- und Administrationsoberfläche. Er gehört nicht zum Bedienweg der Besucher.&lt;br /&gt;
&lt;br /&gt;
== Aufgabe im Gesamtsystem ==&lt;br /&gt;
&lt;br /&gt;
Der Monitor führt die projektspezifischen Instanzen von &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; paarweise zusammen und zeigt deren Erreichbarkeit an.&lt;br /&gt;
&lt;br /&gt;
 Status-Monitor → management/health von megbes-external&lt;br /&gt;
 Status-Monitor → management/health von megbes-internal&lt;br /&gt;
 Status-Monitor → optionale Integrationsaufrufe über megbes-external → megbes-internal&lt;br /&gt;
&lt;br /&gt;
Die zu überwachenden External- und Internal-Adressen stammen aus der zentralen MegBes-Konfiguration. Der Monitor ersetzt weder die Projektseite im Wiki noch eine vollständige Funktionsprüfung der Medienstationen.&lt;br /&gt;
&lt;br /&gt;
== Statusübersicht und Health-Checks ==&lt;br /&gt;
&lt;br /&gt;
Für jedes konfigurierte Projekt zeigt die Startseite die External- und Internal-Seite nebeneinander an.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Anzeige&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt; || Der geschützte Aufruf von &amp;lt;code&amp;gt;/management/health&amp;lt;/code&amp;gt; war erfolgreich.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ERROR&amp;lt;/code&amp;gt; || Der Health-Endpunkt konnte nicht erfolgreich aufgerufen werden; Ursache können Anwendung, Netzwerk, TLS, Konfiguration oder Berechtigung sein.&lt;br /&gt;
|-&lt;br /&gt;
| External-Details || Projektname, geprüfte URL, Mailsteuerung und gegebenenfalls Internal-Aufrufprotokolle sowie Integrationstest.&lt;br /&gt;
|-&lt;br /&gt;
| Internal-Details || Projektname, geprüfte URL und Mailsteuerung.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für die Management-Endpunkte setzt der Monitor einen konfigurierten Header samt Schlüssel. Diese Werte sind Geheimnisse und werden nicht im Wiki dokumentiert.&lt;br /&gt;
&lt;br /&gt;
Beim External-Check wird zusätzlich &amp;lt;code&amp;gt;/management/info&amp;lt;/code&amp;gt; gelesen. Liefert die Anwendung dort ihren Namen, kann der Monitor vorhandene Internal-Aufrufprotokolle zuordnen.&lt;br /&gt;
&lt;br /&gt;
Die Statusdaten werden zwischengespeichert. Die Funktion „Neu laden“ leert den Cache und fragt die Zustände erneut ab. Ein grüner Health-Check bestätigt die Erreichbarkeit der Anwendung, aber nicht automatisch UDP-Empfang oder Reaktion einer Medienstation.&lt;br /&gt;
&lt;br /&gt;
== E-Mail-Benachrichtigungen ==&lt;br /&gt;
&lt;br /&gt;
Bei aktiviertem SSL-Betrieb prüft ein geplanter Lauf den Zustand stündlich. Für fehlerhafte Instanzen kann der Monitor E-Mails versenden. Im aktuellen Quellstand wird bei einem fortbestehenden Fehler höchstens bei den ersten fünf Prüfläufen benachrichtigt. Ist wieder alles fehlerfrei, wird der Fehlerzähler zurückgesetzt.&lt;br /&gt;
&lt;br /&gt;
Die Benachrichtigung kann je überwachter URL in der Oberfläche aktiviert oder deaktiviert werden. Eine Deaktivierung soll nur mit dokumentiertem Grund und vorgesehener Reaktivierung erfolgen.&lt;br /&gt;
&lt;br /&gt;
== Internal-Aufrufprotokolle ==&lt;br /&gt;
&lt;br /&gt;
Wenn für eine External-Anwendung entsprechende Datensätze vorhanden sind, zeigt der Monitor die zuletzt gespeicherten Aufrufe an. Die Ansicht ist auf die jüngsten 100 Einträge begrenzt und absteigend nach Zeitpunkt sortiert.&lt;br /&gt;
&lt;br /&gt;
Diese Protokolle helfen bei der Frage, ob und wann &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt; die interne Seite aufgerufen hat. Sie ersetzen nicht das Anwendungslog von &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; und bestätigen noch keine Reaktion des UDP-Endgeräts.&lt;br /&gt;
&lt;br /&gt;
== Manueller Integrationstest ==&lt;br /&gt;
&lt;br /&gt;
Der Monitor kann je Projekt einen funktionalen Test mit oder ohne Authentifizierung ausführen.&lt;br /&gt;
&lt;br /&gt;
=== Projekt mit Authentifizierung ===&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Test durchläuft:&lt;br /&gt;
&lt;br /&gt;
# administrative Anmeldung über &amp;lt;code&amp;gt;/authenticate&amp;lt;/code&amp;gt;&lt;br /&gt;
# Prüfung über &amp;lt;code&amp;gt;/verify-admin&amp;lt;/code&amp;gt;&lt;br /&gt;
# Erzeugung eines temporären Tickets über &amp;lt;code&amp;gt;/ticket&amp;lt;/code&amp;gt;&lt;br /&gt;
# Aktivierung über &amp;lt;code&amp;gt;/enter-system&amp;lt;/code&amp;gt;&lt;br /&gt;
# Benutzerprüfung über &amp;lt;code&amp;gt;/verify&amp;lt;/code&amp;gt;&lt;br /&gt;
# Stationsanmeldung über &amp;lt;code&amp;gt;/media-station&amp;lt;/code&amp;gt;&lt;br /&gt;
# optional einen Befehl über &amp;lt;code&amp;gt;/video-command&amp;lt;/code&amp;gt;&lt;br /&gt;
# Stationsabmeldung über &amp;lt;code&amp;gt;DELETE /media-station&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Projekt ohne Authentifizierung ===&lt;br /&gt;
&lt;br /&gt;
Ohne aktivierte MegBes-Sicherheit besteht der Funktionstest im aktuellen Stand nur aus dem optionalen Aufruf von &amp;lt;code&amp;gt;/video-command&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:2px solid #b32424; padding:0.8em; margin:1em 0; background:#fff3f3;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Achtung: Der Integrationstest kann eine reale Station steuern.&#039;&#039;&#039; Ist „Kommunikation zum internen MegBes-Server ebenfalls abtesten“ aktiviert, sendet der aktuelle Quellstand den Befehl &amp;lt;code&amp;gt;120-start&amp;lt;/code&amp;gt;. Vor dem Test muss geprüft werden, was Station 120 im betreffenden Projekt ist und welche Wirkung &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; dort hat. Der Test darf nicht unkontrolliert im laufenden Ausstellungsbetrieb ausgeführt werden.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein erfolgreicher Integrationstest bestätigt abhängig von der gewählten Option den HTTP-Ablauf bis &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt; beziehungsweise bis zur Übergabe an &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt;. Empfang und Ausführung des UDP-Befehls am Endgerät müssen separat kontrolliert werden.&lt;br /&gt;
&lt;br /&gt;
== Zertifikatsverwaltung ==&lt;br /&gt;
&lt;br /&gt;
Der Status-Monitor verwaltet die Client-Zertifikate für geschützte Verbindungen zu &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt;. Die Oberfläche kann projektspezifische Zertifikate:&lt;br /&gt;
&lt;br /&gt;
* anzeigen,&lt;br /&gt;
* erstellen,&lt;br /&gt;
* als Paket beziehungsweise Keystore herunterladen,&lt;br /&gt;
* Installationshinweise anzeigen und&lt;br /&gt;
* löschen.&lt;br /&gt;
&lt;br /&gt;
Die Metadaten werden persistent gespeichert; die erzeugten Dateien liegen in der konfigurierten Zertifikatsablage. Neue Zertifikate werden über das mitgelieferte OpenSSL-Skript erzeugt. Einzelheiten und Sicherheitsregeln stehen unter [[Zertifikate]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Löschen ist eine betriebswirksame und potenziell destruktive Aktion.&#039;&#039;&#039; Vorher müssen Projektzuordnung, verwendete Dateien, Rückkehrweg und betroffene Container geprüft werden. Passwörter, private Schlüssel und Zertifikatsdateien gehören nicht ins Wiki.&lt;br /&gt;
&lt;br /&gt;
== Passwortwerkzeug ==&lt;br /&gt;
&lt;br /&gt;
Die Oberfläche enthält ein Hilfswerkzeug zum Ver- und Entschlüsseln von Konfigurationswerten mit der gemeinsamen MegBes-Kryptofunktion. Die Klartext- oder Chiffrewerte dürfen weder in Tickets noch ins Wiki oder in ungeschützte Zwischenablagen übernommen werden.&lt;br /&gt;
&lt;br /&gt;
== Zugriffsschutz ==&lt;br /&gt;
&lt;br /&gt;
Der gesamte Status-Monitor ist mit Ausnahme der Loginseite und ihrer unmittelbar benötigten Gestaltungselemente anmeldungs­pflichtig. Der aktuelle Stand verwendet einen konfigurierten Benutzer mit BCrypt-geprüftem Passwort im Arbeitsspeicher der Anwendung.&lt;br /&gt;
&lt;br /&gt;
Trotz Login ist die Oberfläche hochprivilegiert: Sie kann Integrationstests auslösen, Mailbenachrichtigungen verändern, Geheimwerte verarbeiten und Zertifikate erstellen oder löschen. Daher gelten mindestens:&lt;br /&gt;
&lt;br /&gt;
* ausschließlich HTTPS verwenden,&lt;br /&gt;
* Zugang nur an berechtigte Betriebsverantwortliche vergeben,&lt;br /&gt;
* Zugangsdaten nicht gemeinsam oder im Wiki speichern,&lt;br /&gt;
* Sitzung nach der Arbeit beenden,&lt;br /&gt;
* Änderungen und Tests projektbezogen dokumentieren,&lt;br /&gt;
* öffentliches Caching von Administrationsseiten auf Proxy-Ebene verhindern.&lt;br /&gt;
&lt;br /&gt;
== Diagnose mit dem Status-Monitor ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Beobachtung&lt;br /&gt;
! Nächster Schritt&lt;br /&gt;
|-&lt;br /&gt;
| External und Internal beide &amp;lt;code&amp;gt;ERROR&amp;lt;/code&amp;gt; || zentrale Erreichbarkeit, DNS, Monitor-Konfiguration und Zertifikate prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| External &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;, Internal &amp;lt;code&amp;gt;ERROR&amp;lt;/code&amp;gt; || lokale Erreichbarkeit, DynDNS/Router, TLS-Zertifikat und &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| beide &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;, Bedienbefehl ohne Wirkung || Integrationstest kontrolliert ausführen, danach Internal-Log, UDP-Weg und Station prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Internal-Aufruf ist protokolliert, Station reagiert nicht || &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt;-Log, Zieladresse, UDP-Port und Stationssoftware prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Health-Anzeige wirkt veraltet || „Neu laden“ verwenden und anschließend die Komponentenlogs vergleichen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Grenzen und Dokumentationspflicht ==&lt;br /&gt;
&lt;br /&gt;
Der Status-Monitor zeigt Laufzeitinformationen, jedoch keinen vollständigen dauerhaften Anlagenstand. Auf der jeweiligen [[Projektübersicht|Projektseite]] bleiben mindestens Release, Domains, interne Erreichbarkeit, Zertifikatszuordnung, Betriebsart und Ergebnis relevanter Tests zu dokumentieren.&lt;br /&gt;
&lt;br /&gt;
Quellcodebasis dieser Beschreibung ist das Modul &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt; des aktuellen MegBes-Repositorys. Bei einem abweichenden installierten Release hat dessen tatsächliches Verhalten Vorrang.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Wartung, Backups und Fehlerdiagnose]], [[Routing und Signalweg]], [[Zertifikate]], [[Softwaremodule]], [[Client-Feedback und Stationsmeldungen]] und [[Stationsseitige Diagnose]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;br /&gt;
[[Kategorie:Monitoring]]&lt;br /&gt;
[[Kategorie:Status-Monitor]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Web-Frontend_entwickeln&amp;diff=72</id>
		<title>Web-Frontend entwickeln</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Web-Frontend_entwickeln&amp;diff=72"/>
		<updated>2026-08-06T20:50:08Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erkenntnisse aus GKP-Frontendprüfung: Hash-Routing, Sitzungsdaten, Hosting und Reproduzierbarkeit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Web-Frontend entwickeln =&lt;br /&gt;
&lt;br /&gt;
== Zweck und Geltungsbereich ==&lt;br /&gt;
&lt;br /&gt;
Diese Seite beschreibt die HTML-/JavaScript-Anbindung eines Web-Frontends an &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt;. Sie basiert auf den Controllern und Request-Modellen des aktuellen MegBes-Repositorys. Vor der Freigabe eines Frontends muss trotzdem geprüft werden, welcher MegBes-Release im betreffenden Projekt installiert ist.&lt;br /&gt;
&lt;br /&gt;
Das Frontend spricht ausschließlich &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt; an. Direkte Browseraufrufe an &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; sind nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
 Browser → HTTPS → megbes-external → megbes-internal → UDP → Station&lt;br /&gt;
&lt;br /&gt;
== Vor Beginn festlegen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wert&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| API-Basisadresse || HTTPS-Adresse der projektspezifischen External-Instanz&lt;br /&gt;
|-&lt;br /&gt;
| Projektkennung || Wert für &amp;lt;code&amp;gt;prSc&amp;lt;/code&amp;gt;; gegen den eingesetzten Release und die Projektkonfiguration prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Sicherheitsmodus || ohne Authentifizierung oder zentrale Ticket-/Benutzerauthentifizierung&lt;br /&gt;
|-&lt;br /&gt;
| Stationssteuerung || extern oder durch &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; kontrolliert&lt;br /&gt;
|-&lt;br /&gt;
| Token-Header || Wert der Laufzeitkonfiguration &amp;lt;code&amp;gt;jwt.header&amp;lt;/code&amp;gt;; nicht pauschal &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; annehmen&lt;br /&gt;
|-&lt;br /&gt;
| Stationsnummern || freigegebene Stationen des Projekts&lt;br /&gt;
|-&lt;br /&gt;
| Stationsbefehle || projektspezifische Befehle, die die jeweilige Station tatsächlich versteht&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Domains, Headername, Projektkennung, Stationsnummern und Befehle dürfen nicht ungeprüft von einem anderen Projekt übernommen werden.&lt;br /&gt;
&lt;br /&gt;
== Betriebsarten und Stationsstatus ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Betriebsart&lt;br /&gt;
! Konfiguration&lt;br /&gt;
! Verhalten des Frontends&lt;br /&gt;
|-&lt;br /&gt;
| extern verwaltete Stationsbelegung || &amp;lt;code&amp;gt;megbes.internal.station.controlled=false&amp;lt;/code&amp;gt; || Station über &amp;lt;code&amp;gt;GET /media-station?station=...&amp;lt;/code&amp;gt; belegen; den Status-Endpunkt nicht aufrufen&lt;br /&gt;
|-&lt;br /&gt;
| durch &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; kontrollierte Station || &amp;lt;code&amp;gt;megbes.internal.station.controlled=true&amp;lt;/code&amp;gt; || nach der Stationsanmeldung zusätzlich &amp;lt;code&amp;gt;GET /media-station/status/{stationNumber}&amp;lt;/code&amp;gt; auswerten&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Liefert der Status-Endpunkt &amp;lt;code&amp;gt;404 Not Found&amp;lt;/code&amp;gt;, obwohl Anmeldung und Stationsbelegung funktionieren, ist zuerst die Betriebsart zu prüfen. Bei extern verwalteter Stationsbelegung ist &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; erwartbar und bedeutet nicht, dass die Station belegt oder gestört ist. Die Betriebsart soll als zentraler Projektwert gepflegt und nicht aus einer fehlgeschlagenen Statusabfrage erraten werden.&lt;br /&gt;
== API-Übersicht ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode und Pfad&lt;br /&gt;
! Zweck&lt;br /&gt;
! Berechtigung&lt;br /&gt;
! Erfolgsantwort&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /info&amp;lt;/code&amp;gt; || vom Server empfangenen User-Agent prüfen || frei || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; mit User-Agent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /authenticate&amp;lt;/code&amp;gt; || Ticket-Monitor administrativ authentifizieren || frei; benötigt Header &amp;lt;code&amp;gt;customer&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;id&amp;quot;: &amp;quot;...&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /verify-admin&amp;lt;/code&amp;gt; || Administrationskennung prüfen || ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /ticket&amp;lt;/code&amp;gt; || Ticketcode erzeugen oder vorhandenen unbenutzten Code abrufen || ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;id&amp;quot;: &amp;quot;......&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /enter-system&amp;lt;/code&amp;gt; || Ticketcode einmalig aktivieren || frei || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /verify&amp;lt;/code&amp;gt; || aktivierte Benutzerkennung prüfen || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /media-station?station=...&amp;lt;/code&amp;gt; || Benutzer an Station anmelden || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /media-station/status/{stationNumber}&amp;lt;/code&amp;gt; || Stationszustand abrufen || USER oder ADMIN; nur bei intern kontrollierten Stationen || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;stationStatus&amp;quot;: &amp;quot;...&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /video-command&amp;lt;/code&amp;gt; || einen oder mehrere UDP-Befehle senden || ohne Security frei, sonst USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; mit leerem Antwortkörper&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DELETE /media-station&amp;lt;/code&amp;gt; || Benutzer abmelden und Station zurücksetzen || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Authentifizierungsregel ==&lt;br /&gt;
&lt;br /&gt;
MegBes liefert dem Browser beziehungsweise Ticket-Monitor eine &#039;&#039;&#039;Pseudo-ID&#039;&#039;&#039;. Der eigentliche JWT verbleibt serverseitig. Bei geschützten Folgeaufrufen sendet das Frontend die Pseudo-ID als Wert des projektspezifisch konfigurierten Token-Headers.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;konfigurierter-token-header&amp;gt;: &amp;lt;Pseudo-ID&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Headername stammt aus &amp;lt;code&amp;gt;jwt.header&amp;lt;/code&amp;gt;. Er darf im Frontend nicht geraten werden. Die Pseudo-ID ist wie eine Sitzungskennung zu behandeln: nicht protokollieren, nicht in URLs anhängen und nicht ins Wiki kopieren.&lt;br /&gt;
&lt;br /&gt;
== Request-Modelle ==&lt;br /&gt;
&lt;br /&gt;
=== System betreten ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /enter-system&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;systemCode&amp;quot;: &amp;quot;123456&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemCode&amp;lt;/code&amp;gt; darf nicht leer sein. Ein unbekannter oder bereits verwendeter Code ergibt &amp;lt;code&amp;gt;401 Unauthorized&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Stationsbefehl ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /video-command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;prSc&amp;quot;: &amp;quot;&amp;lt;Projektkennung&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;statNoCommands&amp;quot;: [&lt;br /&gt;
    &amp;quot;12-play&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regeln des aktuellen Request-Modells:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;prSc&amp;lt;/code&amp;gt; ist Pflicht und darf nicht leer sein.&lt;br /&gt;
* &amp;lt;code&amp;gt;statNoCommands&amp;lt;/code&amp;gt; ist eine nicht leere Liste.&lt;br /&gt;
* Jeder Listeneintrag folgt &amp;lt;code&amp;gt;\d{0,3}-[0-9a-zA-Z]{2,20}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Vor dem Bindestrich sind damit null bis drei Ziffern zulässig; für produktive Stationsbefehle soll eine eindeutige, im Projekt dokumentierte Stationsnummer verwendet werden.&lt;br /&gt;
* Nach dem Bindestrich sind zwei bis zwanzig ASCII-Buchstaben oder Ziffern zulässig.&lt;br /&gt;
* Ob ein formal gültiger Befehl fachlich unterstützt wird, entscheidet die jeweilige Stationssoftware.&lt;br /&gt;
&lt;br /&gt;
Beispiele wie &amp;lt;code&amp;gt;12-play&amp;lt;/code&amp;gt; sind nur Formbeispiele und keine globale MegBes-Befehlsliste.&lt;br /&gt;
&lt;br /&gt;
== Empfohlener JavaScript-API-Client ==&lt;br /&gt;
&lt;br /&gt;
Die Netzwerkanbindung soll an einer Stelle gekapselt werden. Dadurch bleiben Fehlerbehandlung, Header und JSON-Verarbeitung konsistent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const megBesConfig = Object.freeze({&lt;br /&gt;
  apiBase: &amp;quot;https://&amp;lt;projekt&amp;gt;.megbes.de&amp;quot;,&lt;br /&gt;
  projectCode: &amp;quot;&amp;lt;PROJEKTKENNUNG&amp;gt;&amp;quot;,&lt;br /&gt;
  tokenHeader: &amp;quot;&amp;lt;WERT-AUS-jwt.header&amp;gt;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
class MegBesError extends Error {&lt;br /&gt;
  constructor(message, status, responseBody) {&lt;br /&gt;
    super(message);&lt;br /&gt;
    this.name = &amp;quot;MegBesError&amp;quot;;&lt;br /&gt;
    this.status = status;&lt;br /&gt;
    this.responseBody = responseBody;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function megBesRequest(path, {&lt;br /&gt;
  method = &amp;quot;GET&amp;quot;,&lt;br /&gt;
  token = null,&lt;br /&gt;
  body = undefined,&lt;br /&gt;
  headers = {}&lt;br /&gt;
} = {}) {&lt;br /&gt;
  const requestHeaders = new Headers(headers);&lt;br /&gt;
&lt;br /&gt;
  if (token) {&lt;br /&gt;
    requestHeaders.set(megBesConfig.tokenHeader, token);&lt;br /&gt;
  }&lt;br /&gt;
  if (body !== undefined) {&lt;br /&gt;
    requestHeaders.set(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  let response;&lt;br /&gt;
  try {&lt;br /&gt;
    response = await fetch(`${megBesConfig.apiBase}${path}`, {&lt;br /&gt;
      method,&lt;br /&gt;
      headers: requestHeaders,&lt;br /&gt;
      body: body === undefined ? undefined : JSON.stringify(body),&lt;br /&gt;
      cache: &amp;quot;no-store&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
  } catch (cause) {&lt;br /&gt;
    throw new MegBesError(&amp;quot;MegBes ist nicht erreichbar.&amp;quot;, 0, cause);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const contentType = response.headers.get(&amp;quot;content-type&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
  const responseBody = contentType.includes(&amp;quot;application/json&amp;quot;)&lt;br /&gt;
    ? await response.json()&lt;br /&gt;
    : await response.text();&lt;br /&gt;
&lt;br /&gt;
  if (!response.ok) {&lt;br /&gt;
    throw new MegBesError(&lt;br /&gt;
      `MegBes-Aufruf fehlgeschlagen (${response.status}).`,&lt;br /&gt;
      response.status,&lt;br /&gt;
      responseBody&lt;br /&gt;
    );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return responseBody;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variante A: Frontend ohne Authentifizierung ==&lt;br /&gt;
&lt;br /&gt;
Diese Variante existiert nur, wenn &amp;lt;code&amp;gt;megbes.security&amp;lt;/code&amp;gt; für die External-Instanz nicht aktiviert ist. Das Frontend darf diesen Modus nicht anhand eines fehlgeschlagenen Loginversuchs erraten; er wird vor der Entwicklung projektspezifisch festgelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function sendCommandWithoutAuthentication(station, command) {&lt;br /&gt;
  return megBesRequest(&amp;quot;/video-command&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    body: {&lt;br /&gt;
      prSc: megBesConfig.projectCode,&lt;br /&gt;
      statNoCommands: [`${station}-${command}`]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch ohne MegBes-Authentifizierung muss die External-Instanz ausschließlich über HTTPS angesprochen werden. Welche Personen die Seite erreichen dürfen, ist außerhalb von MegBes abzusichern.&lt;br /&gt;
&lt;br /&gt;
== Variante B: Ticket-Monitor ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Ticket-Monitor authentifizieren ===&lt;br /&gt;
&lt;br /&gt;
Der Ticket-Monitor ruft &amp;lt;code&amp;gt;POST /authenticate&amp;lt;/code&amp;gt; mit den Headern &amp;lt;code&amp;gt;customer&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; auf. Zusätzlich prüft MegBes den User-Agent gegen die Projektkonfiguration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function authenticateTicketMonitor(customer, authId) {&lt;br /&gt;
  const response = await megBesRequest(&amp;quot;/authenticate&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    headers: {&lt;br /&gt;
      customer,&lt;br /&gt;
      authId&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  return response.id;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; ist ein Geheimwert und darf nicht fest in ausgelieferter Browser-JavaScript-Datei stehen. Wenn der Ticket-Monitor nur statische öffentliche Dateien ausliefert, ist dieses Verfahren sicherheitlich neu zu bewerten. Die Kennung gehört in eine geschützte Laufzeitumgebung oder einen vertrauenswürdigen lokalen Dienst.&lt;br /&gt;
&lt;br /&gt;
=== 2. Ticketcode abrufen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function getTicket(adminToken, customer, ticketMonitorNumber) {&lt;br /&gt;
  const query = new URLSearchParams({&lt;br /&gt;
    customer,&lt;br /&gt;
    ticketMonitorNumber: String(ticketMonitorNumber)&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  const response = await megBesRequest(`/ticket?${query}`, {&lt;br /&gt;
    token: adminToken&lt;br /&gt;
  });&lt;br /&gt;
  return response.id;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der gelieferte Code ist im aktuellen Stand sechsstellig. Das Frontend soll ihn als String behandeln, damit eine führende Null nicht verloren geht.&lt;br /&gt;
&lt;br /&gt;
== Variante C: Besucher- oder Guide-Frontend mit Ticketcode ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Code aktivieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function enterSystem(systemCode) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/enter-system&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    body: { systemCode }&lt;br /&gt;
  });&lt;br /&gt;
  return systemCode;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreichem Eintritt dient derselbe Code als Pseudo-ID für die weiteren Aufrufe. Ein Ticketcode kann nur einmal aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== 2. Kennung prüfen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function verifyUser(userToken) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/verify&amp;quot;, { token: userToken });&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. An Station anmelden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function loginStation(userToken, stationNumber) {&lt;br /&gt;
  const query = new URLSearchParams({ station: String(stationNumber) });&lt;br /&gt;
  await megBesRequest(`/media-station?${query}`, { token: userToken });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im intern kontrollierten Modus ist die Stationsnummer zwingend. Ein &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; kann neben einer ungültigen Kennung auch bedeuten, dass die Station belegt ist oder die Stationsanmeldung abgelehnt wurde. Die Bedienoberfläche darf deshalb nicht automatisch behaupten, der Ticketcode sei falsch.&lt;br /&gt;
&lt;br /&gt;
=== 4. Optional Stationsstatus prüfen ===&lt;br /&gt;
&lt;br /&gt;
Dieser Endpunkt ist nur verfügbar, wenn &amp;lt;code&amp;gt;megbes.internal.station.controlled=true&amp;lt;/code&amp;gt; gilt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function getStationStatus(userToken, stationNumber) {&lt;br /&gt;
  const response = await megBesRequest(&lt;br /&gt;
    `/media-station/status/${encodeURIComponent(stationNumber)}`,&lt;br /&gt;
    { token: userToken }&lt;br /&gt;
  );&lt;br /&gt;
  return response.stationStatus;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Code verwendet unter anderem die Zustände &amp;lt;code&amp;gt;OPEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IDLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REMOTE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;TOUCHSCREEN&amp;lt;/code&amp;gt;. Die Oberfläche soll unbekannte künftige Werte neutral anzeigen und nicht abstürzen.&lt;br /&gt;
&lt;br /&gt;
=== 5. Befehl senden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function sendCommand(userToken, stationNumber, command) {&lt;br /&gt;
  return megBesRequest(&amp;quot;/video-command&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    token: userToken,&lt;br /&gt;
    body: {&lt;br /&gt;
      prSc: megBesConfig.projectCode,&lt;br /&gt;
      statNoCommands: [`${stationNumber}-${command}`]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erfolgreiche Aufruf antwortet derzeit mit &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt; und leerem Body. JavaScript-Clients dürfen deshalb nicht zwingend JSON parsen. Bei jQuery ist insbesondere &amp;lt;code&amp;gt;dataType: &#039;json&#039;&amp;lt;/code&amp;gt; für diesen Aufruf ungeeignet. Eine Navigation oder Erfolgsmeldung darf nur im Erfolgszweig (&amp;lt;code&amp;gt;.done()&amp;lt;/code&amp;gt; beziehungsweise &amp;lt;code&amp;gt;response.ok&amp;lt;/code&amp;gt;) erfolgen, nicht in &amp;lt;code&amp;gt;.always()&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;finally&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6. Station abmelden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function logoutStation(userToken) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/media-station&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;DELETE&amp;quot;,&lt;br /&gt;
    token: userToken&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abmeldung soll über eine sichtbare Bedienhandlung und bei regulärem Abschluss erfolgen. Ein Aufruf in &amp;lt;code&amp;gt;beforeunload&amp;lt;/code&amp;gt; ist allein nicht zuverlässig, da Browser ausstehende Requests beim Schließen abbrechen können. Der projektspezifische Stations-Timer bleibt daher als Rückfallebene erforderlich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DELETE /media-station&amp;lt;/code&amp;gt; gibt nur die aktuell belegte Station frei und setzt deren Stationszustand zurück. Die Ticket- beziehungsweise Benutzersitzung bleibt gültig; ein anschließendes &amp;lt;code&amp;gt;GET /verify&amp;lt;/code&amp;gt; kann daher weiterhin &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt; liefern. So kann derselbe Besucher danach eine andere Station auswählen.&lt;br /&gt;
&lt;br /&gt;
== Vollständiger Ablauf eines Besucher-Frontends ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let userToken = null;&lt;br /&gt;
let activeStation = null;&lt;br /&gt;
&lt;br /&gt;
async function startSession(systemCode, stationNumber) {&lt;br /&gt;
  userToken = await enterSystem(systemCode);&lt;br /&gt;
  await verifyUser(userToken);&lt;br /&gt;
&lt;br /&gt;
  // Nur im intern kontrollierten Modus vorab verwenden.&lt;br /&gt;
  // const status = await getStationStatus(userToken, stationNumber);&lt;br /&gt;
&lt;br /&gt;
  await loginStation(userToken, stationNumber);&lt;br /&gt;
  activeStation = String(stationNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function play(command) {&lt;br /&gt;
  if (!userToken || !activeStation) {&lt;br /&gt;
    throw new Error(&amp;quot;Keine aktive MegBes-Station.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  await sendCommand(userToken, activeStation, command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function endSession() {&lt;br /&gt;
  if (userToken &amp;amp;&amp;amp; activeStation) {&lt;br /&gt;
    await logoutStation(userToken);&lt;br /&gt;
  }&lt;br /&gt;
  userToken = null;&lt;br /&gt;
  activeStation = null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Minimales HTML-Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Das Beispiel zeigt die Struktur, ist aber ohne projektspezifische Werte und Gestaltung nicht produktionsfertig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;MegBes-Steuerung&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;main&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;login-form&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;label for=&amp;quot;code&amp;quot;&amp;gt;Ticketcode&amp;lt;/label&amp;gt;&lt;br /&gt;
      &amp;lt;input id=&amp;quot;code&amp;quot; name=&amp;quot;code&amp;quot; inputmode=&amp;quot;numeric&amp;quot; autocomplete=&amp;quot;one-time-code&amp;quot; required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;label for=&amp;quot;station&amp;quot;&amp;gt;Station&amp;lt;/label&amp;gt;&lt;br /&gt;
      &amp;lt;input id=&amp;quot;station&amp;quot; name=&amp;quot;station&amp;quot; inputmode=&amp;quot;numeric&amp;quot; required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Station verbinden&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;section id=&amp;quot;controls&amp;quot; hidden&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; data-command=&amp;quot;play&amp;quot;&amp;gt;Start&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; data-command=&amp;quot;stop&amp;quot;&amp;gt;Stopp&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; id=&amp;quot;logout&amp;quot;&amp;gt;Beenden&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p id=&amp;quot;message&amp;quot; role=&amp;quot;status&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/main&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;megbes-api.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    const form = document.querySelector(&amp;quot;#login-form&amp;quot;);&lt;br /&gt;
    const controls = document.querySelector(&amp;quot;#controls&amp;quot;);&lt;br /&gt;
    const message = document.querySelector(&amp;quot;#message&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    form.addEventListener(&amp;quot;submit&amp;quot;, async event =&amp;gt; {&lt;br /&gt;
      event.preventDefault();&lt;br /&gt;
      message.textContent = &amp;quot;Verbindung wird hergestellt ...&amp;quot;;&lt;br /&gt;
      try {&lt;br /&gt;
        await startSession(form.code.value.trim(), form.station.value.trim());&lt;br /&gt;
        controls.hidden = false;&lt;br /&gt;
        message.textContent = &amp;quot;Station ist verbunden.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    controls.addEventListener(&amp;quot;click&amp;quot;, async event =&amp;gt; {&lt;br /&gt;
      const command = event.target.dataset.command;&lt;br /&gt;
      if (!command) return;&lt;br /&gt;
      try {&lt;br /&gt;
        event.target.disabled = true;&lt;br /&gt;
        await play(command);&lt;br /&gt;
        message.textContent = &amp;quot;Befehl wurde gesendet.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      } finally {&lt;br /&gt;
        event.target.disabled = false;&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.querySelector(&amp;quot;#logout&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, async () =&amp;gt; {&lt;br /&gt;
      try {&lt;br /&gt;
        await endSession();&lt;br /&gt;
        controls.hidden = true;&lt;br /&gt;
        form.reset();&lt;br /&gt;
        message.textContent = &amp;quot;Sitzung wurde beendet.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die sichtbaren Befehle &amp;lt;code&amp;gt;play&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; sind ebenfalls nur Platzhalter. Sie werden durch die freigegebenen Projektbefehle ersetzt.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function messageForMegBesError(error) {&lt;br /&gt;
  if (!(error instanceof MegBesError)) {&lt;br /&gt;
    return &amp;quot;Unerwarteter Fehler. Bitte Aufsicht informieren.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  switch (error.status) {&lt;br /&gt;
    case 0:&lt;br /&gt;
      return &amp;quot;MegBes ist derzeit nicht erreichbar.&amp;quot;;&lt;br /&gt;
    case 400:&lt;br /&gt;
      return &amp;quot;Die Anfrage ist unvollständig oder ungültig.&amp;quot;;&lt;br /&gt;
    case 401:&lt;br /&gt;
      return &amp;quot;Anmeldung, Berechtigung oder Stationsbelegung konnte nicht bestätigt werden.&amp;quot;;&lt;br /&gt;
    case 403:&lt;br /&gt;
      return &amp;quot;Die Station ist für diese Sitzung nicht freigegeben.&amp;quot;;&lt;br /&gt;
    case 404:&lt;br /&gt;
      return &amp;quot;Diese Funktion ist in der aktuellen Betriebsart nicht verfügbar.&amp;quot;;&lt;br /&gt;
    default:&lt;br /&gt;
      return &amp;quot;MegBes konnte den Auftrag nicht ausführen.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keine rohen Backend-Antworten, Stacktraces, Tokens oder internen Adressen an Besucher ausgeben. Technische Details gehören in eine geschützte Diagnoseansicht oder in bereinigte Logs.&lt;br /&gt;
&lt;br /&gt;
== Zustands- und Bedienregeln ==&lt;br /&gt;
&lt;br /&gt;
* Mehrfachklicks verhindern, solange ein Request läuft.&lt;br /&gt;
* Erst nach erfolgreicher Antwort den nächsten fachlichen Zustand anzeigen.&lt;br /&gt;
* Ticketcodes und Pseudo-IDs nicht in der URL oder in dauerhaftem &amp;lt;code&amp;gt;localStorage&amp;lt;/code&amp;gt; speichern. Für eine nur bis zum Schließen des Tabs benötigte Sitzung ist &amp;lt;code&amp;gt;sessionStorage&amp;lt;/code&amp;gt; geeigneter; noch besser ist flüchtiger JavaScript-Zustand.&lt;br /&gt;
* Ticketcodes, Pseudo-IDs und vollständige authentifizierte Request-URLs nicht mit &amp;lt;code&amp;gt;console.log&amp;lt;/code&amp;gt; oder in öffentlich zugängliche Telemetrie schreiben.&lt;br /&gt;
* Bei Seitenneuladung &amp;lt;code&amp;gt;/verify&amp;lt;/code&amp;gt; verwenden, bevor eine bestehende Sitzung angenommen wird.&lt;br /&gt;
* Eine Station erst als verbunden anzeigen, wenn &amp;lt;code&amp;gt;/media-station&amp;lt;/code&amp;gt; erfolgreich war.&lt;br /&gt;
* Bei &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; nicht automatisch einen falschen Code behaupten; auch Belegung und Projektzuordnung sind mögliche Ursachen.&lt;br /&gt;
* Bei unbekanntem Stationsstatus eine neutrale Fehlermeldung anzeigen.&lt;br /&gt;
* Bedienoberfläche tastaturbedienbar gestalten und Statusmeldungen mit &amp;lt;code&amp;gt;aria-live&amp;lt;/code&amp;gt; ausgeben.&lt;br /&gt;
* Stationsbefehle nur aus einer festen projektspezifischen Positivliste erzeugen, nicht aus frei eingegebenem Besuchertest.&lt;br /&gt;
&lt;br /&gt;
=== Ticketcode aus der URL entfernen ===&lt;br /&gt;
&lt;br /&gt;
Wird ein Ticketcode per QR-Link als Queryparameter übergeben, soll das Frontend ihn nach erfolgreicher Übernahme sofort aus der sichtbaren URL und der aktuellen Browserhistorie entfernen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const cleanUrl = new URL(window.location.href);&lt;br /&gt;
cleanUrl.searchParams.delete(&amp;quot;systemCode&amp;quot;);&lt;br /&gt;
window.history.replaceState({}, &amp;quot;&amp;quot;, cleanUrl.pathname + cleanUrl.search + cleanUrl.hash);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird der Code nicht unnötig in kopierten URLs oder späteren Screenshots weitergegeben. Webserver- und Proxy-Logs können den ursprünglichen Request trotzdem bereits enthalten; Ticketcodes bleiben deshalb kurzlebige Einmalwerte.&lt;br /&gt;
&lt;br /&gt;
Bei Frontends mit Hash-Routing, zum Beispiel &amp;lt;code&amp;gt;/#/welcome?systemCode=123456&amp;lt;/code&amp;gt;, liegt der Parameter nicht in &amp;lt;code&amp;gt;window.location.search&amp;lt;/code&amp;gt;, sondern innerhalb des Hash-Fragments. Er muss dort separat entfernt werden. Das verwendete Router-Framework soll nach erfolgreicher Übernahme mit einer ersetzenden Navigation (&amp;lt;code&amp;gt;replace&amp;lt;/code&amp;gt;, nicht &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;) auf dieselbe Route ohne &amp;lt;code&amp;gt;systemCode&amp;lt;/code&amp;gt; wechseln. So bleibt der Code auch nicht über die Zurück-Funktion erreichbar. Ein Hash-Fragment wird zwar nicht an den Webserver übertragen, bleibt aber in Browserhistorie, kopierten Links und Screenshots sichtbar.&lt;br /&gt;
== CORS und Hosting ==&lt;br /&gt;
&lt;br /&gt;
Der aktuelle MegBes-Stand erlaubt CORS-Anfragen grundsätzlich. Das ist keine Zusage, dass jede zukünftige Instanz beliebige Origins akzeptiert. Bevorzugt werden Frontend und API unter kontrollierten HTTPS-Adressen betrieben. Ein CORS-Fehler wird nicht durch Abschalten von Browsersicherheit oder Zertifikatsprüfung umgangen.&lt;br /&gt;
&lt;br /&gt;
Bei Single-Page-Anwendungen müssen öffentlicher Basispfad, Router-Basis und Asset-Pfade zur tatsächlichen Bereitstellung passen. Eine Anwendung, die beispielsweise für &amp;lt;code&amp;gt;/projekt/&amp;lt;/code&amp;gt; gebaut wurde, ist ohne Neubau oder passende Serverkonfiguration nicht automatisch unter &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; oder einem anderen Unterpfad lauffähig. Direkte Aufrufe von Unterseiten benötigen außerdem eine passende Fallback-Regel auf &amp;lt;code&amp;gt;index.html&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zum Projektarchiv gehören neben den ausgelieferten minifizierten Dateien auch Quellcode, Paketmanifest, Lockdatei, Build-Anweisung und verwendete Laufzeitversionen. Nur ein Build-Ordner reicht nicht aus, um das Frontend später reproduzierbar zu warten oder sicher zu aktualisieren.&lt;br /&gt;
&lt;br /&gt;
== Bestätigter Referenztest ==&lt;br /&gt;
&lt;br /&gt;
Am 6. August 2026 wurde der vollständige Ablauf gegen das interne Projekt &amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt; geprüft:&lt;br /&gt;
&lt;br /&gt;
 Frontend-Aufruf → megbes-external → megbes-internal → UDP-Versand&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;enter-system&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt;, Stationsanmeldung, &amp;lt;code&amp;gt;video-command&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, Stationsabmeldung sowie erneutes &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt; antworteten jeweils mit &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; bestätigte den UDP-Versand beider Befehle. Die Statusabfrage antwortete erwartungsgemäß mit &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt;, da &amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt; nicht im intern stationsgesteuerten Modus betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Der Test bestätigt den Signalweg bis zum UDP-Versand. Der tatsächliche Empfang und die Reaktion eines Endgeräts müssen bei der Projektabnahme separat geprüft werden. Konkrete IP-Adressen, Ticketcodes und Geheimwerte werden nicht im Wiki festgehalten.&lt;br /&gt;
&lt;br /&gt;
Eine ergänzende statische Prüfung des umfangreicheren Ionic-/Vue-Frontends des Projekts &amp;lt;code&amp;gt;gkp&amp;lt;/code&amp;gt; bestätigte denselben grundlegenden Vertrag: Aktivierung über &amp;lt;code&amp;gt;/enter-system&amp;lt;/code&amp;gt;, Prüfung über &amp;lt;code&amp;gt;/verify&amp;lt;/code&amp;gt;, Stationsanmeldung und optionaler Stationsstatus sowie Befehle über &amp;lt;code&amp;gt;/video-command&amp;lt;/code&amp;gt; mit dem konfigurierten Authentifizierungsheader. Damit ist der hier beschriebene Ablauf nicht nur mit der Minimalvorlage, sondern auch mit einem realen mehrsprachigen Projektfrontend konsistent. Diese Prüfung bestätigt die API-Verwendung im Frontend; sie ersetzt keinen End-to-End-Test der jeweiligen Installation.&lt;br /&gt;
== Entwicklungs- und Abnahmetests ==&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;GET /info&amp;lt;/code&amp;gt; von der vorgesehenen Hardware aufrufen.&lt;br /&gt;
# korrekten Sicherheits- und Stationsmodus bestätigen.&lt;br /&gt;
# gültigen, ungültigen, bereits benutzten und abgelaufenen Ticketcode testen.&lt;br /&gt;
# freie, belegte und unbekannte Station testen.&lt;br /&gt;
# jeden freigegebenen Stationsbefehl einzeln prüfen.&lt;br /&gt;
# Mehrfachklick und parallele Requests testen.&lt;br /&gt;
# Abmeldung und erneute Anmeldung testen.&lt;br /&gt;
# Browser-Neuladen sowie Neustart von Frontend-Hardware und Station testen.&lt;br /&gt;
# Ausfall von External, Internal und Stationsnetz jeweils getrennt simulieren.&lt;br /&gt;
# sicherstellen, dass keine Tokens oder Geheimwerte in URL, Konsole, Screenshot oder sichtbarer Fehlermeldung erscheinen.&lt;br /&gt;
# installierten External-/Internal-Release, Frontend-Version und Testergebnis auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Grenzen dieser Referenz ==&lt;br /&gt;
&lt;br /&gt;
Diese Seite dokumentiert den API-Vertrag des aktuellen Repository-Stands. Projektspezifische Stationsbefehle, Gestaltung, Inhalte, Ticketdruck, Hardware-Autostart und konkrete Frontend-Dateipfade werden auf der jeweiligen Projektseite dokumentiert. Bei Abweichungen hat der tatsächlich eingesetzte Release Vorrang.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Web-Frontend]], [[Bedienung und Authentifizierung]], [[UDP und Stationszustände]], [[Client-Feedback und Stationsmeldungen]] und [[Routing und Signalweg]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Frontend]]&lt;br /&gt;
[[Kategorie:Entwicklung]]&lt;br /&gt;
[[Kategorie:API]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Web-Frontend_entwickeln&amp;diff=71</id>
		<title>Web-Frontend entwickeln</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Web-Frontend_entwickeln&amp;diff=71"/>
		<updated>2026-08-06T20:29:11Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Zeilenumbrueche der neuen Abschnitte korrigiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Web-Frontend entwickeln =&lt;br /&gt;
&lt;br /&gt;
== Zweck und Geltungsbereich ==&lt;br /&gt;
&lt;br /&gt;
Diese Seite beschreibt die HTML-/JavaScript-Anbindung eines Web-Frontends an &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt;. Sie basiert auf den Controllern und Request-Modellen des aktuellen MegBes-Repositorys. Vor der Freigabe eines Frontends muss trotzdem geprüft werden, welcher MegBes-Release im betreffenden Projekt installiert ist.&lt;br /&gt;
&lt;br /&gt;
Das Frontend spricht ausschließlich &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt; an. Direkte Browseraufrufe an &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; sind nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
 Browser → HTTPS → megbes-external → megbes-internal → UDP → Station&lt;br /&gt;
&lt;br /&gt;
== Vor Beginn festlegen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wert&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| API-Basisadresse || HTTPS-Adresse der projektspezifischen External-Instanz&lt;br /&gt;
|-&lt;br /&gt;
| Projektkennung || Wert für &amp;lt;code&amp;gt;prSc&amp;lt;/code&amp;gt;; gegen den eingesetzten Release und die Projektkonfiguration prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Sicherheitsmodus || ohne Authentifizierung oder zentrale Ticket-/Benutzerauthentifizierung&lt;br /&gt;
|-&lt;br /&gt;
| Stationssteuerung || extern oder durch &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; kontrolliert&lt;br /&gt;
|-&lt;br /&gt;
| Token-Header || Wert der Laufzeitkonfiguration &amp;lt;code&amp;gt;jwt.header&amp;lt;/code&amp;gt;; nicht pauschal &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; annehmen&lt;br /&gt;
|-&lt;br /&gt;
| Stationsnummern || freigegebene Stationen des Projekts&lt;br /&gt;
|-&lt;br /&gt;
| Stationsbefehle || projektspezifische Befehle, die die jeweilige Station tatsächlich versteht&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Domains, Headername, Projektkennung, Stationsnummern und Befehle dürfen nicht ungeprüft von einem anderen Projekt übernommen werden.&lt;br /&gt;
&lt;br /&gt;
== Betriebsarten und Stationsstatus ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Betriebsart&lt;br /&gt;
! Konfiguration&lt;br /&gt;
! Verhalten des Frontends&lt;br /&gt;
|-&lt;br /&gt;
| extern verwaltete Stationsbelegung || &amp;lt;code&amp;gt;megbes.internal.station.controlled=false&amp;lt;/code&amp;gt; || Station über &amp;lt;code&amp;gt;GET /media-station?station=...&amp;lt;/code&amp;gt; belegen; den Status-Endpunkt nicht aufrufen&lt;br /&gt;
|-&lt;br /&gt;
| durch &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; kontrollierte Station || &amp;lt;code&amp;gt;megbes.internal.station.controlled=true&amp;lt;/code&amp;gt; || nach der Stationsanmeldung zusätzlich &amp;lt;code&amp;gt;GET /media-station/status/{stationNumber}&amp;lt;/code&amp;gt; auswerten&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Liefert der Status-Endpunkt &amp;lt;code&amp;gt;404 Not Found&amp;lt;/code&amp;gt;, obwohl Anmeldung und Stationsbelegung funktionieren, ist zuerst die Betriebsart zu prüfen. Bei extern verwalteter Stationsbelegung ist &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; erwartbar und bedeutet nicht, dass die Station belegt oder gestört ist. Die Betriebsart soll als zentraler Projektwert gepflegt und nicht aus einer fehlgeschlagenen Statusabfrage erraten werden.&lt;br /&gt;
== API-Übersicht ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode und Pfad&lt;br /&gt;
! Zweck&lt;br /&gt;
! Berechtigung&lt;br /&gt;
! Erfolgsantwort&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /info&amp;lt;/code&amp;gt; || vom Server empfangenen User-Agent prüfen || frei || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; mit User-Agent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /authenticate&amp;lt;/code&amp;gt; || Ticket-Monitor administrativ authentifizieren || frei; benötigt Header &amp;lt;code&amp;gt;customer&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;id&amp;quot;: &amp;quot;...&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /verify-admin&amp;lt;/code&amp;gt; || Administrationskennung prüfen || ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /ticket&amp;lt;/code&amp;gt; || Ticketcode erzeugen oder vorhandenen unbenutzten Code abrufen || ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;id&amp;quot;: &amp;quot;......&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /enter-system&amp;lt;/code&amp;gt; || Ticketcode einmalig aktivieren || frei || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /verify&amp;lt;/code&amp;gt; || aktivierte Benutzerkennung prüfen || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /media-station?station=...&amp;lt;/code&amp;gt; || Benutzer an Station anmelden || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /media-station/status/{stationNumber}&amp;lt;/code&amp;gt; || Stationszustand abrufen || USER oder ADMIN; nur bei intern kontrollierten Stationen || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;stationStatus&amp;quot;: &amp;quot;...&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /video-command&amp;lt;/code&amp;gt; || einen oder mehrere UDP-Befehle senden || ohne Security frei, sonst USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; mit leerem Antwortkörper&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DELETE /media-station&amp;lt;/code&amp;gt; || Benutzer abmelden und Station zurücksetzen || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Authentifizierungsregel ==&lt;br /&gt;
&lt;br /&gt;
MegBes liefert dem Browser beziehungsweise Ticket-Monitor eine &#039;&#039;&#039;Pseudo-ID&#039;&#039;&#039;. Der eigentliche JWT verbleibt serverseitig. Bei geschützten Folgeaufrufen sendet das Frontend die Pseudo-ID als Wert des projektspezifisch konfigurierten Token-Headers.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;konfigurierter-token-header&amp;gt;: &amp;lt;Pseudo-ID&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Headername stammt aus &amp;lt;code&amp;gt;jwt.header&amp;lt;/code&amp;gt;. Er darf im Frontend nicht geraten werden. Die Pseudo-ID ist wie eine Sitzungskennung zu behandeln: nicht protokollieren, nicht in URLs anhängen und nicht ins Wiki kopieren.&lt;br /&gt;
&lt;br /&gt;
== Request-Modelle ==&lt;br /&gt;
&lt;br /&gt;
=== System betreten ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /enter-system&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;systemCode&amp;quot;: &amp;quot;123456&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemCode&amp;lt;/code&amp;gt; darf nicht leer sein. Ein unbekannter oder bereits verwendeter Code ergibt &amp;lt;code&amp;gt;401 Unauthorized&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Stationsbefehl ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /video-command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;prSc&amp;quot;: &amp;quot;&amp;lt;Projektkennung&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;statNoCommands&amp;quot;: [&lt;br /&gt;
    &amp;quot;12-play&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regeln des aktuellen Request-Modells:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;prSc&amp;lt;/code&amp;gt; ist Pflicht und darf nicht leer sein.&lt;br /&gt;
* &amp;lt;code&amp;gt;statNoCommands&amp;lt;/code&amp;gt; ist eine nicht leere Liste.&lt;br /&gt;
* Jeder Listeneintrag folgt &amp;lt;code&amp;gt;\d{0,3}-[0-9a-zA-Z]{2,20}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Vor dem Bindestrich sind damit null bis drei Ziffern zulässig; für produktive Stationsbefehle soll eine eindeutige, im Projekt dokumentierte Stationsnummer verwendet werden.&lt;br /&gt;
* Nach dem Bindestrich sind zwei bis zwanzig ASCII-Buchstaben oder Ziffern zulässig.&lt;br /&gt;
* Ob ein formal gültiger Befehl fachlich unterstützt wird, entscheidet die jeweilige Stationssoftware.&lt;br /&gt;
&lt;br /&gt;
Beispiele wie &amp;lt;code&amp;gt;12-play&amp;lt;/code&amp;gt; sind nur Formbeispiele und keine globale MegBes-Befehlsliste.&lt;br /&gt;
&lt;br /&gt;
== Empfohlener JavaScript-API-Client ==&lt;br /&gt;
&lt;br /&gt;
Die Netzwerkanbindung soll an einer Stelle gekapselt werden. Dadurch bleiben Fehlerbehandlung, Header und JSON-Verarbeitung konsistent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const megBesConfig = Object.freeze({&lt;br /&gt;
  apiBase: &amp;quot;https://&amp;lt;projekt&amp;gt;.megbes.de&amp;quot;,&lt;br /&gt;
  projectCode: &amp;quot;&amp;lt;PROJEKTKENNUNG&amp;gt;&amp;quot;,&lt;br /&gt;
  tokenHeader: &amp;quot;&amp;lt;WERT-AUS-jwt.header&amp;gt;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
class MegBesError extends Error {&lt;br /&gt;
  constructor(message, status, responseBody) {&lt;br /&gt;
    super(message);&lt;br /&gt;
    this.name = &amp;quot;MegBesError&amp;quot;;&lt;br /&gt;
    this.status = status;&lt;br /&gt;
    this.responseBody = responseBody;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function megBesRequest(path, {&lt;br /&gt;
  method = &amp;quot;GET&amp;quot;,&lt;br /&gt;
  token = null,&lt;br /&gt;
  body = undefined,&lt;br /&gt;
  headers = {}&lt;br /&gt;
} = {}) {&lt;br /&gt;
  const requestHeaders = new Headers(headers);&lt;br /&gt;
&lt;br /&gt;
  if (token) {&lt;br /&gt;
    requestHeaders.set(megBesConfig.tokenHeader, token);&lt;br /&gt;
  }&lt;br /&gt;
  if (body !== undefined) {&lt;br /&gt;
    requestHeaders.set(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  let response;&lt;br /&gt;
  try {&lt;br /&gt;
    response = await fetch(`${megBesConfig.apiBase}${path}`, {&lt;br /&gt;
      method,&lt;br /&gt;
      headers: requestHeaders,&lt;br /&gt;
      body: body === undefined ? undefined : JSON.stringify(body),&lt;br /&gt;
      cache: &amp;quot;no-store&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
  } catch (cause) {&lt;br /&gt;
    throw new MegBesError(&amp;quot;MegBes ist nicht erreichbar.&amp;quot;, 0, cause);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const contentType = response.headers.get(&amp;quot;content-type&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
  const responseBody = contentType.includes(&amp;quot;application/json&amp;quot;)&lt;br /&gt;
    ? await response.json()&lt;br /&gt;
    : await response.text();&lt;br /&gt;
&lt;br /&gt;
  if (!response.ok) {&lt;br /&gt;
    throw new MegBesError(&lt;br /&gt;
      `MegBes-Aufruf fehlgeschlagen (${response.status}).`,&lt;br /&gt;
      response.status,&lt;br /&gt;
      responseBody&lt;br /&gt;
    );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return responseBody;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variante A: Frontend ohne Authentifizierung ==&lt;br /&gt;
&lt;br /&gt;
Diese Variante existiert nur, wenn &amp;lt;code&amp;gt;megbes.security&amp;lt;/code&amp;gt; für die External-Instanz nicht aktiviert ist. Das Frontend darf diesen Modus nicht anhand eines fehlgeschlagenen Loginversuchs erraten; er wird vor der Entwicklung projektspezifisch festgelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function sendCommandWithoutAuthentication(station, command) {&lt;br /&gt;
  return megBesRequest(&amp;quot;/video-command&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    body: {&lt;br /&gt;
      prSc: megBesConfig.projectCode,&lt;br /&gt;
      statNoCommands: [`${station}-${command}`]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch ohne MegBes-Authentifizierung muss die External-Instanz ausschließlich über HTTPS angesprochen werden. Welche Personen die Seite erreichen dürfen, ist außerhalb von MegBes abzusichern.&lt;br /&gt;
&lt;br /&gt;
== Variante B: Ticket-Monitor ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Ticket-Monitor authentifizieren ===&lt;br /&gt;
&lt;br /&gt;
Der Ticket-Monitor ruft &amp;lt;code&amp;gt;POST /authenticate&amp;lt;/code&amp;gt; mit den Headern &amp;lt;code&amp;gt;customer&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; auf. Zusätzlich prüft MegBes den User-Agent gegen die Projektkonfiguration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function authenticateTicketMonitor(customer, authId) {&lt;br /&gt;
  const response = await megBesRequest(&amp;quot;/authenticate&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    headers: {&lt;br /&gt;
      customer,&lt;br /&gt;
      authId&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  return response.id;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; ist ein Geheimwert und darf nicht fest in ausgelieferter Browser-JavaScript-Datei stehen. Wenn der Ticket-Monitor nur statische öffentliche Dateien ausliefert, ist dieses Verfahren sicherheitlich neu zu bewerten. Die Kennung gehört in eine geschützte Laufzeitumgebung oder einen vertrauenswürdigen lokalen Dienst.&lt;br /&gt;
&lt;br /&gt;
=== 2. Ticketcode abrufen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function getTicket(adminToken, customer, ticketMonitorNumber) {&lt;br /&gt;
  const query = new URLSearchParams({&lt;br /&gt;
    customer,&lt;br /&gt;
    ticketMonitorNumber: String(ticketMonitorNumber)&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  const response = await megBesRequest(`/ticket?${query}`, {&lt;br /&gt;
    token: adminToken&lt;br /&gt;
  });&lt;br /&gt;
  return response.id;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der gelieferte Code ist im aktuellen Stand sechsstellig. Das Frontend soll ihn als String behandeln, damit eine führende Null nicht verloren geht.&lt;br /&gt;
&lt;br /&gt;
== Variante C: Besucher- oder Guide-Frontend mit Ticketcode ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Code aktivieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function enterSystem(systemCode) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/enter-system&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    body: { systemCode }&lt;br /&gt;
  });&lt;br /&gt;
  return systemCode;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreichem Eintritt dient derselbe Code als Pseudo-ID für die weiteren Aufrufe. Ein Ticketcode kann nur einmal aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== 2. Kennung prüfen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function verifyUser(userToken) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/verify&amp;quot;, { token: userToken });&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. An Station anmelden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function loginStation(userToken, stationNumber) {&lt;br /&gt;
  const query = new URLSearchParams({ station: String(stationNumber) });&lt;br /&gt;
  await megBesRequest(`/media-station?${query}`, { token: userToken });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im intern kontrollierten Modus ist die Stationsnummer zwingend. Ein &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; kann neben einer ungültigen Kennung auch bedeuten, dass die Station belegt ist oder die Stationsanmeldung abgelehnt wurde. Die Bedienoberfläche darf deshalb nicht automatisch behaupten, der Ticketcode sei falsch.&lt;br /&gt;
&lt;br /&gt;
=== 4. Optional Stationsstatus prüfen ===&lt;br /&gt;
&lt;br /&gt;
Dieser Endpunkt ist nur verfügbar, wenn &amp;lt;code&amp;gt;megbes.internal.station.controlled=true&amp;lt;/code&amp;gt; gilt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function getStationStatus(userToken, stationNumber) {&lt;br /&gt;
  const response = await megBesRequest(&lt;br /&gt;
    `/media-station/status/${encodeURIComponent(stationNumber)}`,&lt;br /&gt;
    { token: userToken }&lt;br /&gt;
  );&lt;br /&gt;
  return response.stationStatus;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Code verwendet unter anderem die Zustände &amp;lt;code&amp;gt;OPEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IDLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REMOTE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;TOUCHSCREEN&amp;lt;/code&amp;gt;. Die Oberfläche soll unbekannte künftige Werte neutral anzeigen und nicht abstürzen.&lt;br /&gt;
&lt;br /&gt;
=== 5. Befehl senden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function sendCommand(userToken, stationNumber, command) {&lt;br /&gt;
  return megBesRequest(&amp;quot;/video-command&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    token: userToken,&lt;br /&gt;
    body: {&lt;br /&gt;
      prSc: megBesConfig.projectCode,&lt;br /&gt;
      statNoCommands: [`${stationNumber}-${command}`]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erfolgreiche Aufruf antwortet derzeit mit &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt; und leerem Body. JavaScript-Clients dürfen deshalb nicht zwingend JSON parsen. Bei jQuery ist insbesondere &amp;lt;code&amp;gt;dataType: &#039;json&#039;&amp;lt;/code&amp;gt; für diesen Aufruf ungeeignet. Eine Navigation oder Erfolgsmeldung darf nur im Erfolgszweig (&amp;lt;code&amp;gt;.done()&amp;lt;/code&amp;gt; beziehungsweise &amp;lt;code&amp;gt;response.ok&amp;lt;/code&amp;gt;) erfolgen, nicht in &amp;lt;code&amp;gt;.always()&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;finally&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6. Station abmelden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function logoutStation(userToken) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/media-station&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;DELETE&amp;quot;,&lt;br /&gt;
    token: userToken&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abmeldung soll über eine sichtbare Bedienhandlung und bei regulärem Abschluss erfolgen. Ein Aufruf in &amp;lt;code&amp;gt;beforeunload&amp;lt;/code&amp;gt; ist allein nicht zuverlässig, da Browser ausstehende Requests beim Schließen abbrechen können. Der projektspezifische Stations-Timer bleibt daher als Rückfallebene erforderlich.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;DELETE /media-station&amp;lt;/code&amp;gt; gibt nur die aktuell belegte Station frei und setzt deren Stationszustand zurück. Die Ticket- beziehungsweise Benutzersitzung bleibt gültig; ein anschließendes &amp;lt;code&amp;gt;GET /verify&amp;lt;/code&amp;gt; kann daher weiterhin &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt; liefern. So kann derselbe Besucher danach eine andere Station auswählen.&lt;br /&gt;
&lt;br /&gt;
== Vollständiger Ablauf eines Besucher-Frontends ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let userToken = null;&lt;br /&gt;
let activeStation = null;&lt;br /&gt;
&lt;br /&gt;
async function startSession(systemCode, stationNumber) {&lt;br /&gt;
  userToken = await enterSystem(systemCode);&lt;br /&gt;
  await verifyUser(userToken);&lt;br /&gt;
&lt;br /&gt;
  // Nur im intern kontrollierten Modus vorab verwenden.&lt;br /&gt;
  // const status = await getStationStatus(userToken, stationNumber);&lt;br /&gt;
&lt;br /&gt;
  await loginStation(userToken, stationNumber);&lt;br /&gt;
  activeStation = String(stationNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function play(command) {&lt;br /&gt;
  if (!userToken || !activeStation) {&lt;br /&gt;
    throw new Error(&amp;quot;Keine aktive MegBes-Station.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  await sendCommand(userToken, activeStation, command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function endSession() {&lt;br /&gt;
  if (userToken &amp;amp;&amp;amp; activeStation) {&lt;br /&gt;
    await logoutStation(userToken);&lt;br /&gt;
  }&lt;br /&gt;
  userToken = null;&lt;br /&gt;
  activeStation = null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Minimales HTML-Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Das Beispiel zeigt die Struktur, ist aber ohne projektspezifische Werte und Gestaltung nicht produktionsfertig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;MegBes-Steuerung&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;main&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;login-form&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;label for=&amp;quot;code&amp;quot;&amp;gt;Ticketcode&amp;lt;/label&amp;gt;&lt;br /&gt;
      &amp;lt;input id=&amp;quot;code&amp;quot; name=&amp;quot;code&amp;quot; inputmode=&amp;quot;numeric&amp;quot; autocomplete=&amp;quot;one-time-code&amp;quot; required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;label for=&amp;quot;station&amp;quot;&amp;gt;Station&amp;lt;/label&amp;gt;&lt;br /&gt;
      &amp;lt;input id=&amp;quot;station&amp;quot; name=&amp;quot;station&amp;quot; inputmode=&amp;quot;numeric&amp;quot; required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Station verbinden&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;section id=&amp;quot;controls&amp;quot; hidden&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; data-command=&amp;quot;play&amp;quot;&amp;gt;Start&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; data-command=&amp;quot;stop&amp;quot;&amp;gt;Stopp&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; id=&amp;quot;logout&amp;quot;&amp;gt;Beenden&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p id=&amp;quot;message&amp;quot; role=&amp;quot;status&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/main&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;megbes-api.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    const form = document.querySelector(&amp;quot;#login-form&amp;quot;);&lt;br /&gt;
    const controls = document.querySelector(&amp;quot;#controls&amp;quot;);&lt;br /&gt;
    const message = document.querySelector(&amp;quot;#message&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    form.addEventListener(&amp;quot;submit&amp;quot;, async event =&amp;gt; {&lt;br /&gt;
      event.preventDefault();&lt;br /&gt;
      message.textContent = &amp;quot;Verbindung wird hergestellt ...&amp;quot;;&lt;br /&gt;
      try {&lt;br /&gt;
        await startSession(form.code.value.trim(), form.station.value.trim());&lt;br /&gt;
        controls.hidden = false;&lt;br /&gt;
        message.textContent = &amp;quot;Station ist verbunden.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    controls.addEventListener(&amp;quot;click&amp;quot;, async event =&amp;gt; {&lt;br /&gt;
      const command = event.target.dataset.command;&lt;br /&gt;
      if (!command) return;&lt;br /&gt;
      try {&lt;br /&gt;
        event.target.disabled = true;&lt;br /&gt;
        await play(command);&lt;br /&gt;
        message.textContent = &amp;quot;Befehl wurde gesendet.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      } finally {&lt;br /&gt;
        event.target.disabled = false;&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.querySelector(&amp;quot;#logout&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, async () =&amp;gt; {&lt;br /&gt;
      try {&lt;br /&gt;
        await endSession();&lt;br /&gt;
        controls.hidden = true;&lt;br /&gt;
        form.reset();&lt;br /&gt;
        message.textContent = &amp;quot;Sitzung wurde beendet.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die sichtbaren Befehle &amp;lt;code&amp;gt;play&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; sind ebenfalls nur Platzhalter. Sie werden durch die freigegebenen Projektbefehle ersetzt.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function messageForMegBesError(error) {&lt;br /&gt;
  if (!(error instanceof MegBesError)) {&lt;br /&gt;
    return &amp;quot;Unerwarteter Fehler. Bitte Aufsicht informieren.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  switch (error.status) {&lt;br /&gt;
    case 0:&lt;br /&gt;
      return &amp;quot;MegBes ist derzeit nicht erreichbar.&amp;quot;;&lt;br /&gt;
    case 400:&lt;br /&gt;
      return &amp;quot;Die Anfrage ist unvollständig oder ungültig.&amp;quot;;&lt;br /&gt;
    case 401:&lt;br /&gt;
      return &amp;quot;Anmeldung, Berechtigung oder Stationsbelegung konnte nicht bestätigt werden.&amp;quot;;&lt;br /&gt;
    case 403:&lt;br /&gt;
      return &amp;quot;Die Station ist für diese Sitzung nicht freigegeben.&amp;quot;;&lt;br /&gt;
    case 404:&lt;br /&gt;
      return &amp;quot;Diese Funktion ist in der aktuellen Betriebsart nicht verfügbar.&amp;quot;;&lt;br /&gt;
    default:&lt;br /&gt;
      return &amp;quot;MegBes konnte den Auftrag nicht ausführen.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keine rohen Backend-Antworten, Stacktraces, Tokens oder internen Adressen an Besucher ausgeben. Technische Details gehören in eine geschützte Diagnoseansicht oder in bereinigte Logs.&lt;br /&gt;
&lt;br /&gt;
== Zustands- und Bedienregeln ==&lt;br /&gt;
&lt;br /&gt;
* Mehrfachklicks verhindern, solange ein Request läuft.&lt;br /&gt;
* Erst nach erfolgreicher Antwort den nächsten fachlichen Zustand anzeigen.&lt;br /&gt;
* Ticketcodes und Pseudo-IDs nicht in der URL oder in dauerhaftem &amp;lt;code&amp;gt;localStorage&amp;lt;/code&amp;gt; speichern.&lt;br /&gt;
* Bei Seitenneuladung &amp;lt;code&amp;gt;/verify&amp;lt;/code&amp;gt; verwenden, bevor eine bestehende Sitzung angenommen wird.&lt;br /&gt;
* Eine Station erst als verbunden anzeigen, wenn &amp;lt;code&amp;gt;/media-station&amp;lt;/code&amp;gt; erfolgreich war.&lt;br /&gt;
* Bei &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; nicht automatisch einen falschen Code behaupten; auch Belegung und Projektzuordnung sind mögliche Ursachen.&lt;br /&gt;
* Bei unbekanntem Stationsstatus eine neutrale Fehlermeldung anzeigen.&lt;br /&gt;
* Bedienoberfläche tastaturbedienbar gestalten und Statusmeldungen mit &amp;lt;code&amp;gt;aria-live&amp;lt;/code&amp;gt; ausgeben.&lt;br /&gt;
* Stationsbefehle nur aus einer festen projektspezifischen Positivliste erzeugen, nicht aus frei eingegebenem Besuchertest.&lt;br /&gt;
&lt;br /&gt;
=== Ticketcode aus der URL entfernen ===&lt;br /&gt;
&lt;br /&gt;
Wird ein Ticketcode per QR-Link als Queryparameter übergeben, soll das Frontend ihn nach erfolgreicher Übernahme sofort aus der sichtbaren URL und der aktuellen Browserhistorie entfernen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const cleanUrl = new URL(window.location.href);&lt;br /&gt;
cleanUrl.searchParams.delete(&amp;quot;systemCode&amp;quot;);&lt;br /&gt;
window.history.replaceState({}, &amp;quot;&amp;quot;, cleanUrl.pathname + cleanUrl.search + cleanUrl.hash);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird der Code nicht unnötig in kopierten URLs oder späteren Screenshots weitergegeben. Webserver- und Proxy-Logs können den ursprünglichen Request trotzdem bereits enthalten; Ticketcodes bleiben deshalb kurzlebige Einmalwerte.&lt;br /&gt;
== CORS und Hosting ==&lt;br /&gt;
&lt;br /&gt;
Der aktuelle MegBes-Stand erlaubt CORS-Anfragen grundsätzlich. Das ist keine Zusage, dass jede zukünftige Instanz beliebige Origins akzeptiert. Bevorzugt werden Frontend und API unter kontrollierten HTTPS-Adressen betrieben. Ein CORS-Fehler wird nicht durch Abschalten von Browsersicherheit oder Zertifikatsprüfung umgangen.&lt;br /&gt;
&lt;br /&gt;
== Bestätigter Referenztest ==&lt;br /&gt;
&lt;br /&gt;
Am 6. August 2026 wurde der vollständige Ablauf gegen das interne Projekt &amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt; geprüft:&lt;br /&gt;
&lt;br /&gt;
 Frontend-Aufruf → megbes-external → megbes-internal → UDP-Versand&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;enter-system&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt;, Stationsanmeldung, &amp;lt;code&amp;gt;video-command&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, Stationsabmeldung sowie erneutes &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt; antworteten jeweils mit &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; bestätigte den UDP-Versand beider Befehle. Die Statusabfrage antwortete erwartungsgemäß mit &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt;, da &amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt; nicht im intern stationsgesteuerten Modus betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Der Test bestätigt den Signalweg bis zum UDP-Versand. Der tatsächliche Empfang und die Reaktion eines Endgeräts müssen bei der Projektabnahme separat geprüft werden. Konkrete IP-Adressen, Ticketcodes und Geheimwerte werden nicht im Wiki festgehalten.&lt;br /&gt;
== Entwicklungs- und Abnahmetests ==&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;GET /info&amp;lt;/code&amp;gt; von der vorgesehenen Hardware aufrufen.&lt;br /&gt;
# korrekten Sicherheits- und Stationsmodus bestätigen.&lt;br /&gt;
# gültigen, ungültigen, bereits benutzten und abgelaufenen Ticketcode testen.&lt;br /&gt;
# freie, belegte und unbekannte Station testen.&lt;br /&gt;
# jeden freigegebenen Stationsbefehl einzeln prüfen.&lt;br /&gt;
# Mehrfachklick und parallele Requests testen.&lt;br /&gt;
# Abmeldung und erneute Anmeldung testen.&lt;br /&gt;
# Browser-Neuladen sowie Neustart von Frontend-Hardware und Station testen.&lt;br /&gt;
# Ausfall von External, Internal und Stationsnetz jeweils getrennt simulieren.&lt;br /&gt;
# sicherstellen, dass keine Tokens oder Geheimwerte in URL, Konsole, Screenshot oder sichtbarer Fehlermeldung erscheinen.&lt;br /&gt;
# installierten External-/Internal-Release, Frontend-Version und Testergebnis auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Grenzen dieser Referenz ==&lt;br /&gt;
&lt;br /&gt;
Diese Seite dokumentiert den API-Vertrag des aktuellen Repository-Stands. Projektspezifische Stationsbefehle, Gestaltung, Inhalte, Ticketdruck, Hardware-Autostart und konkrete Frontend-Dateipfade werden auf der jeweiligen Projektseite dokumentiert. Bei Abweichungen hat der tatsächlich eingesetzte Release Vorrang.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Web-Frontend]], [[Bedienung und Authentifizierung]], [[UDP und Stationszustände]], [[Client-Feedback und Stationsmeldungen]] und [[Routing und Signalweg]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Frontend]]&lt;br /&gt;
[[Kategorie:Entwicklung]]&lt;br /&gt;
[[Kategorie:API]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Web-Frontend_entwickeln&amp;diff=70</id>
		<title>Web-Frontend entwickeln</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Web-Frontend_entwickeln&amp;diff=70"/>
		<updated>2026-08-06T20:28:41Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Erkenntnisse aus Tine-End-to-End-Test und blank-Frontend eingearbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Web-Frontend entwickeln =&lt;br /&gt;
&lt;br /&gt;
== Zweck und Geltungsbereich ==&lt;br /&gt;
&lt;br /&gt;
Diese Seite beschreibt die HTML-/JavaScript-Anbindung eines Web-Frontends an &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt;. Sie basiert auf den Controllern und Request-Modellen des aktuellen MegBes-Repositorys. Vor der Freigabe eines Frontends muss trotzdem geprüft werden, welcher MegBes-Release im betreffenden Projekt installiert ist.&lt;br /&gt;
&lt;br /&gt;
Das Frontend spricht ausschließlich &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt; an. Direkte Browseraufrufe an &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; sind nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
 Browser → HTTPS → megbes-external → megbes-internal → UDP → Station&lt;br /&gt;
&lt;br /&gt;
== Vor Beginn festlegen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wert&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| API-Basisadresse || HTTPS-Adresse der projektspezifischen External-Instanz&lt;br /&gt;
|-&lt;br /&gt;
| Projektkennung || Wert für &amp;lt;code&amp;gt;prSc&amp;lt;/code&amp;gt;; gegen den eingesetzten Release und die Projektkonfiguration prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Sicherheitsmodus || ohne Authentifizierung oder zentrale Ticket-/Benutzerauthentifizierung&lt;br /&gt;
|-&lt;br /&gt;
| Stationssteuerung || extern oder durch &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; kontrolliert&lt;br /&gt;
|-&lt;br /&gt;
| Token-Header || Wert der Laufzeitkonfiguration &amp;lt;code&amp;gt;jwt.header&amp;lt;/code&amp;gt;; nicht pauschal &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; annehmen&lt;br /&gt;
|-&lt;br /&gt;
| Stationsnummern || freigegebene Stationen des Projekts&lt;br /&gt;
|-&lt;br /&gt;
| Stationsbefehle || projektspezifische Befehle, die die jeweilige Station tatsächlich versteht&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Domains, Headername, Projektkennung, Stationsnummern und Befehle dürfen nicht ungeprüft von einem anderen Projekt übernommen werden.&lt;br /&gt;
&lt;br /&gt;
== Betriebsarten und Stationsstatus ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Betriebsart&lt;br /&gt;
! Konfiguration&lt;br /&gt;
! Verhalten des Frontends&lt;br /&gt;
|-&lt;br /&gt;
| extern verwaltete Stationsbelegung || &amp;lt;code&amp;gt;megbes.internal.station.controlled=false&amp;lt;/code&amp;gt; || Station über &amp;lt;code&amp;gt;GET /media-station?station=...&amp;lt;/code&amp;gt; belegen; den Status-Endpunkt nicht aufrufen&lt;br /&gt;
|-&lt;br /&gt;
| durch &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; kontrollierte Station || &amp;lt;code&amp;gt;megbes.internal.station.controlled=true&amp;lt;/code&amp;gt; || nach der Stationsanmeldung zusätzlich &amp;lt;code&amp;gt;GET /media-station/status/{stationNumber}&amp;lt;/code&amp;gt; auswerten&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Liefert der Status-Endpunkt &amp;lt;code&amp;gt;404 Not Found&amp;lt;/code&amp;gt;, obwohl Anmeldung und Stationsbelegung funktionieren, ist zuerst die Betriebsart zu prüfen. Bei extern verwalteter Stationsbelegung ist &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; erwartbar und bedeutet nicht, dass die Station belegt oder gestört ist. Die Betriebsart soll als zentraler Projektwert gepflegt und nicht aus einer fehlgeschlagenen Statusabfrage erraten werden.&lt;br /&gt;
== API-Übersicht ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode und Pfad&lt;br /&gt;
! Zweck&lt;br /&gt;
! Berechtigung&lt;br /&gt;
! Erfolgsantwort&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /info&amp;lt;/code&amp;gt; || vom Server empfangenen User-Agent prüfen || frei || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; mit User-Agent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /authenticate&amp;lt;/code&amp;gt; || Ticket-Monitor administrativ authentifizieren || frei; benötigt Header &amp;lt;code&amp;gt;customer&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;id&amp;quot;: &amp;quot;...&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /verify-admin&amp;lt;/code&amp;gt; || Administrationskennung prüfen || ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /ticket&amp;lt;/code&amp;gt; || Ticketcode erzeugen oder vorhandenen unbenutzten Code abrufen || ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;id&amp;quot;: &amp;quot;......&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /enter-system&amp;lt;/code&amp;gt; || Ticketcode einmalig aktivieren || frei || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /verify&amp;lt;/code&amp;gt; || aktivierte Benutzerkennung prüfen || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /media-station?station=...&amp;lt;/code&amp;gt; || Benutzer an Station anmelden || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /media-station/status/{stationNumber}&amp;lt;/code&amp;gt; || Stationszustand abrufen || USER oder ADMIN; nur bei intern kontrollierten Stationen || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;stationStatus&amp;quot;: &amp;quot;...&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /video-command&amp;lt;/code&amp;gt; || einen oder mehrere UDP-Befehle senden || ohne Security frei, sonst USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; mit leerem Antwortkörper&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DELETE /media-station&amp;lt;/code&amp;gt; || Benutzer abmelden und Station zurücksetzen || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Authentifizierungsregel ==&lt;br /&gt;
&lt;br /&gt;
MegBes liefert dem Browser beziehungsweise Ticket-Monitor eine &#039;&#039;&#039;Pseudo-ID&#039;&#039;&#039;. Der eigentliche JWT verbleibt serverseitig. Bei geschützten Folgeaufrufen sendet das Frontend die Pseudo-ID als Wert des projektspezifisch konfigurierten Token-Headers.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;konfigurierter-token-header&amp;gt;: &amp;lt;Pseudo-ID&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Headername stammt aus &amp;lt;code&amp;gt;jwt.header&amp;lt;/code&amp;gt;. Er darf im Frontend nicht geraten werden. Die Pseudo-ID ist wie eine Sitzungskennung zu behandeln: nicht protokollieren, nicht in URLs anhängen und nicht ins Wiki kopieren.&lt;br /&gt;
&lt;br /&gt;
== Request-Modelle ==&lt;br /&gt;
&lt;br /&gt;
=== System betreten ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /enter-system&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;systemCode&amp;quot;: &amp;quot;123456&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemCode&amp;lt;/code&amp;gt; darf nicht leer sein. Ein unbekannter oder bereits verwendeter Code ergibt &amp;lt;code&amp;gt;401 Unauthorized&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Stationsbefehl ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /video-command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;prSc&amp;quot;: &amp;quot;&amp;lt;Projektkennung&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;statNoCommands&amp;quot;: [&lt;br /&gt;
    &amp;quot;12-play&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regeln des aktuellen Request-Modells:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;prSc&amp;lt;/code&amp;gt; ist Pflicht und darf nicht leer sein.&lt;br /&gt;
* &amp;lt;code&amp;gt;statNoCommands&amp;lt;/code&amp;gt; ist eine nicht leere Liste.&lt;br /&gt;
* Jeder Listeneintrag folgt &amp;lt;code&amp;gt;\d{0,3}-[0-9a-zA-Z]{2,20}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Vor dem Bindestrich sind damit null bis drei Ziffern zulässig; für produktive Stationsbefehle soll eine eindeutige, im Projekt dokumentierte Stationsnummer verwendet werden.&lt;br /&gt;
* Nach dem Bindestrich sind zwei bis zwanzig ASCII-Buchstaben oder Ziffern zulässig.&lt;br /&gt;
* Ob ein formal gültiger Befehl fachlich unterstützt wird, entscheidet die jeweilige Stationssoftware.&lt;br /&gt;
&lt;br /&gt;
Beispiele wie &amp;lt;code&amp;gt;12-play&amp;lt;/code&amp;gt; sind nur Formbeispiele und keine globale MegBes-Befehlsliste.&lt;br /&gt;
&lt;br /&gt;
== Empfohlener JavaScript-API-Client ==&lt;br /&gt;
&lt;br /&gt;
Die Netzwerkanbindung soll an einer Stelle gekapselt werden. Dadurch bleiben Fehlerbehandlung, Header und JSON-Verarbeitung konsistent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const megBesConfig = Object.freeze({&lt;br /&gt;
  apiBase: &amp;quot;https://&amp;lt;projekt&amp;gt;.megbes.de&amp;quot;,&lt;br /&gt;
  projectCode: &amp;quot;&amp;lt;PROJEKTKENNUNG&amp;gt;&amp;quot;,&lt;br /&gt;
  tokenHeader: &amp;quot;&amp;lt;WERT-AUS-jwt.header&amp;gt;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
class MegBesError extends Error {&lt;br /&gt;
  constructor(message, status, responseBody) {&lt;br /&gt;
    super(message);&lt;br /&gt;
    this.name = &amp;quot;MegBesError&amp;quot;;&lt;br /&gt;
    this.status = status;&lt;br /&gt;
    this.responseBody = responseBody;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function megBesRequest(path, {&lt;br /&gt;
  method = &amp;quot;GET&amp;quot;,&lt;br /&gt;
  token = null,&lt;br /&gt;
  body = undefined,&lt;br /&gt;
  headers = {}&lt;br /&gt;
} = {}) {&lt;br /&gt;
  const requestHeaders = new Headers(headers);&lt;br /&gt;
&lt;br /&gt;
  if (token) {&lt;br /&gt;
    requestHeaders.set(megBesConfig.tokenHeader, token);&lt;br /&gt;
  }&lt;br /&gt;
  if (body !== undefined) {&lt;br /&gt;
    requestHeaders.set(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  let response;&lt;br /&gt;
  try {&lt;br /&gt;
    response = await fetch(`${megBesConfig.apiBase}${path}`, {&lt;br /&gt;
      method,&lt;br /&gt;
      headers: requestHeaders,&lt;br /&gt;
      body: body === undefined ? undefined : JSON.stringify(body),&lt;br /&gt;
      cache: &amp;quot;no-store&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
  } catch (cause) {&lt;br /&gt;
    throw new MegBesError(&amp;quot;MegBes ist nicht erreichbar.&amp;quot;, 0, cause);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const contentType = response.headers.get(&amp;quot;content-type&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
  const responseBody = contentType.includes(&amp;quot;application/json&amp;quot;)&lt;br /&gt;
    ? await response.json()&lt;br /&gt;
    : await response.text();&lt;br /&gt;
&lt;br /&gt;
  if (!response.ok) {&lt;br /&gt;
    throw new MegBesError(&lt;br /&gt;
      `MegBes-Aufruf fehlgeschlagen (${response.status}).`,&lt;br /&gt;
      response.status,&lt;br /&gt;
      responseBody&lt;br /&gt;
    );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return responseBody;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variante A: Frontend ohne Authentifizierung ==&lt;br /&gt;
&lt;br /&gt;
Diese Variante existiert nur, wenn &amp;lt;code&amp;gt;megbes.security&amp;lt;/code&amp;gt; für die External-Instanz nicht aktiviert ist. Das Frontend darf diesen Modus nicht anhand eines fehlgeschlagenen Loginversuchs erraten; er wird vor der Entwicklung projektspezifisch festgelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function sendCommandWithoutAuthentication(station, command) {&lt;br /&gt;
  return megBesRequest(&amp;quot;/video-command&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    body: {&lt;br /&gt;
      prSc: megBesConfig.projectCode,&lt;br /&gt;
      statNoCommands: [`${station}-${command}`]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch ohne MegBes-Authentifizierung muss die External-Instanz ausschließlich über HTTPS angesprochen werden. Welche Personen die Seite erreichen dürfen, ist außerhalb von MegBes abzusichern.&lt;br /&gt;
&lt;br /&gt;
== Variante B: Ticket-Monitor ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Ticket-Monitor authentifizieren ===&lt;br /&gt;
&lt;br /&gt;
Der Ticket-Monitor ruft &amp;lt;code&amp;gt;POST /authenticate&amp;lt;/code&amp;gt; mit den Headern &amp;lt;code&amp;gt;customer&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; auf. Zusätzlich prüft MegBes den User-Agent gegen die Projektkonfiguration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function authenticateTicketMonitor(customer, authId) {&lt;br /&gt;
  const response = await megBesRequest(&amp;quot;/authenticate&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    headers: {&lt;br /&gt;
      customer,&lt;br /&gt;
      authId&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  return response.id;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; ist ein Geheimwert und darf nicht fest in ausgelieferter Browser-JavaScript-Datei stehen. Wenn der Ticket-Monitor nur statische öffentliche Dateien ausliefert, ist dieses Verfahren sicherheitlich neu zu bewerten. Die Kennung gehört in eine geschützte Laufzeitumgebung oder einen vertrauenswürdigen lokalen Dienst.&lt;br /&gt;
&lt;br /&gt;
=== 2. Ticketcode abrufen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function getTicket(adminToken, customer, ticketMonitorNumber) {&lt;br /&gt;
  const query = new URLSearchParams({&lt;br /&gt;
    customer,&lt;br /&gt;
    ticketMonitorNumber: String(ticketMonitorNumber)&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  const response = await megBesRequest(`/ticket?${query}`, {&lt;br /&gt;
    token: adminToken&lt;br /&gt;
  });&lt;br /&gt;
  return response.id;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der gelieferte Code ist im aktuellen Stand sechsstellig. Das Frontend soll ihn als String behandeln, damit eine führende Null nicht verloren geht.&lt;br /&gt;
&lt;br /&gt;
== Variante C: Besucher- oder Guide-Frontend mit Ticketcode ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Code aktivieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function enterSystem(systemCode) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/enter-system&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    body: { systemCode }&lt;br /&gt;
  });&lt;br /&gt;
  return systemCode;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreichem Eintritt dient derselbe Code als Pseudo-ID für die weiteren Aufrufe. Ein Ticketcode kann nur einmal aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== 2. Kennung prüfen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function verifyUser(userToken) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/verify&amp;quot;, { token: userToken });&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. An Station anmelden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function loginStation(userToken, stationNumber) {&lt;br /&gt;
  const query = new URLSearchParams({ station: String(stationNumber) });&lt;br /&gt;
  await megBesRequest(`/media-station?${query}`, { token: userToken });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im intern kontrollierten Modus ist die Stationsnummer zwingend. Ein &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; kann neben einer ungültigen Kennung auch bedeuten, dass die Station belegt ist oder die Stationsanmeldung abgelehnt wurde. Die Bedienoberfläche darf deshalb nicht automatisch behaupten, der Ticketcode sei falsch.&lt;br /&gt;
&lt;br /&gt;
=== 4. Optional Stationsstatus prüfen ===&lt;br /&gt;
&lt;br /&gt;
Dieser Endpunkt ist nur verfügbar, wenn &amp;lt;code&amp;gt;megbes.internal.station.controlled=true&amp;lt;/code&amp;gt; gilt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function getStationStatus(userToken, stationNumber) {&lt;br /&gt;
  const response = await megBesRequest(&lt;br /&gt;
    `/media-station/status/${encodeURIComponent(stationNumber)}`,&lt;br /&gt;
    { token: userToken }&lt;br /&gt;
  );&lt;br /&gt;
  return response.stationStatus;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Code verwendet unter anderem die Zustände &amp;lt;code&amp;gt;OPEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IDLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REMOTE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;TOUCHSCREEN&amp;lt;/code&amp;gt;. Die Oberfläche soll unbekannte künftige Werte neutral anzeigen und nicht abstürzen.&lt;br /&gt;
&lt;br /&gt;
=== 5. Befehl senden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function sendCommand(userToken, stationNumber, command) {&lt;br /&gt;
  return megBesRequest(&amp;quot;/video-command&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    token: userToken,&lt;br /&gt;
    body: {&lt;br /&gt;
      prSc: megBesConfig.projectCode,&lt;br /&gt;
      statNoCommands: [`${stationNumber}-${command}`]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erfolgreiche Aufruf antwortet derzeit mit &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt; und leerem Body. JavaScript-Clients dürfen deshalb nicht zwingend JSON parsen. Bei jQuery ist insbesondere &amp;lt;code&amp;gt;dataType: &#039;json&#039;&amp;lt;/code&amp;gt; für diesen Aufruf ungeeignet. Eine Navigation oder Erfolgsmeldung darf nur im Erfolgszweig (&amp;lt;code&amp;gt;.done()&amp;lt;/code&amp;gt; beziehungsweise &amp;lt;code&amp;gt;response.ok&amp;lt;/code&amp;gt;) erfolgen, nicht in &amp;lt;code&amp;gt;.always()&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;finally&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6. Station abmelden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function logoutStation(userToken) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/media-station&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;DELETE&amp;quot;,&lt;br /&gt;
    token: userToken&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abmeldung soll über eine sichtbare Bedienhandlung und bei regulärem Abschluss erfolgen. Ein Aufruf in &amp;lt;code&amp;gt;beforeunload&amp;lt;/code&amp;gt; ist allein nicht zuverlässig, da Browser ausstehende Requests beim Schließen abbrechen können. Der projektspezifische Stations-Timer bleibt daher als Rückfallebene erforderlich.`r`n`r`n&amp;lt;code&amp;gt;DELETE /media-station&amp;lt;/code&amp;gt; gibt nur die aktuell belegte Station frei und setzt deren Stationszustand zurück. Die Ticket- beziehungsweise Benutzersitzung bleibt gültig; ein anschließendes &amp;lt;code&amp;gt;GET /verify&amp;lt;/code&amp;gt; kann daher weiterhin &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt; liefern. So kann derselbe Besucher danach eine andere Station auswählen.&lt;br /&gt;
&lt;br /&gt;
== Vollständiger Ablauf eines Besucher-Frontends ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let userToken = null;&lt;br /&gt;
let activeStation = null;&lt;br /&gt;
&lt;br /&gt;
async function startSession(systemCode, stationNumber) {&lt;br /&gt;
  userToken = await enterSystem(systemCode);&lt;br /&gt;
  await verifyUser(userToken);&lt;br /&gt;
&lt;br /&gt;
  // Nur im intern kontrollierten Modus vorab verwenden.&lt;br /&gt;
  // const status = await getStationStatus(userToken, stationNumber);&lt;br /&gt;
&lt;br /&gt;
  await loginStation(userToken, stationNumber);&lt;br /&gt;
  activeStation = String(stationNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function play(command) {&lt;br /&gt;
  if (!userToken || !activeStation) {&lt;br /&gt;
    throw new Error(&amp;quot;Keine aktive MegBes-Station.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  await sendCommand(userToken, activeStation, command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function endSession() {&lt;br /&gt;
  if (userToken &amp;amp;&amp;amp; activeStation) {&lt;br /&gt;
    await logoutStation(userToken);&lt;br /&gt;
  }&lt;br /&gt;
  userToken = null;&lt;br /&gt;
  activeStation = null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Minimales HTML-Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Das Beispiel zeigt die Struktur, ist aber ohne projektspezifische Werte und Gestaltung nicht produktionsfertig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;MegBes-Steuerung&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;main&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;login-form&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;label for=&amp;quot;code&amp;quot;&amp;gt;Ticketcode&amp;lt;/label&amp;gt;&lt;br /&gt;
      &amp;lt;input id=&amp;quot;code&amp;quot; name=&amp;quot;code&amp;quot; inputmode=&amp;quot;numeric&amp;quot; autocomplete=&amp;quot;one-time-code&amp;quot; required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;label for=&amp;quot;station&amp;quot;&amp;gt;Station&amp;lt;/label&amp;gt;&lt;br /&gt;
      &amp;lt;input id=&amp;quot;station&amp;quot; name=&amp;quot;station&amp;quot; inputmode=&amp;quot;numeric&amp;quot; required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Station verbinden&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;section id=&amp;quot;controls&amp;quot; hidden&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; data-command=&amp;quot;play&amp;quot;&amp;gt;Start&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; data-command=&amp;quot;stop&amp;quot;&amp;gt;Stopp&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; id=&amp;quot;logout&amp;quot;&amp;gt;Beenden&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p id=&amp;quot;message&amp;quot; role=&amp;quot;status&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/main&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;megbes-api.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    const form = document.querySelector(&amp;quot;#login-form&amp;quot;);&lt;br /&gt;
    const controls = document.querySelector(&amp;quot;#controls&amp;quot;);&lt;br /&gt;
    const message = document.querySelector(&amp;quot;#message&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    form.addEventListener(&amp;quot;submit&amp;quot;, async event =&amp;gt; {&lt;br /&gt;
      event.preventDefault();&lt;br /&gt;
      message.textContent = &amp;quot;Verbindung wird hergestellt ...&amp;quot;;&lt;br /&gt;
      try {&lt;br /&gt;
        await startSession(form.code.value.trim(), form.station.value.trim());&lt;br /&gt;
        controls.hidden = false;&lt;br /&gt;
        message.textContent = &amp;quot;Station ist verbunden.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    controls.addEventListener(&amp;quot;click&amp;quot;, async event =&amp;gt; {&lt;br /&gt;
      const command = event.target.dataset.command;&lt;br /&gt;
      if (!command) return;&lt;br /&gt;
      try {&lt;br /&gt;
        event.target.disabled = true;&lt;br /&gt;
        await play(command);&lt;br /&gt;
        message.textContent = &amp;quot;Befehl wurde gesendet.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      } finally {&lt;br /&gt;
        event.target.disabled = false;&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.querySelector(&amp;quot;#logout&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, async () =&amp;gt; {&lt;br /&gt;
      try {&lt;br /&gt;
        await endSession();&lt;br /&gt;
        controls.hidden = true;&lt;br /&gt;
        form.reset();&lt;br /&gt;
        message.textContent = &amp;quot;Sitzung wurde beendet.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die sichtbaren Befehle &amp;lt;code&amp;gt;play&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; sind ebenfalls nur Platzhalter. Sie werden durch die freigegebenen Projektbefehle ersetzt.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function messageForMegBesError(error) {&lt;br /&gt;
  if (!(error instanceof MegBesError)) {&lt;br /&gt;
    return &amp;quot;Unerwarteter Fehler. Bitte Aufsicht informieren.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  switch (error.status) {&lt;br /&gt;
    case 0:&lt;br /&gt;
      return &amp;quot;MegBes ist derzeit nicht erreichbar.&amp;quot;;&lt;br /&gt;
    case 400:&lt;br /&gt;
      return &amp;quot;Die Anfrage ist unvollständig oder ungültig.&amp;quot;;&lt;br /&gt;
    case 401:&lt;br /&gt;
      return &amp;quot;Anmeldung, Berechtigung oder Stationsbelegung konnte nicht bestätigt werden.&amp;quot;;&lt;br /&gt;
    case 403:&lt;br /&gt;
      return &amp;quot;Die Station ist für diese Sitzung nicht freigegeben.&amp;quot;;&lt;br /&gt;
    case 404:&lt;br /&gt;
      return &amp;quot;Diese Funktion ist in der aktuellen Betriebsart nicht verfügbar.&amp;quot;;&lt;br /&gt;
    default:&lt;br /&gt;
      return &amp;quot;MegBes konnte den Auftrag nicht ausführen.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keine rohen Backend-Antworten, Stacktraces, Tokens oder internen Adressen an Besucher ausgeben. Technische Details gehören in eine geschützte Diagnoseansicht oder in bereinigte Logs.&lt;br /&gt;
&lt;br /&gt;
== Zustands- und Bedienregeln ==&lt;br /&gt;
&lt;br /&gt;
* Mehrfachklicks verhindern, solange ein Request läuft.&lt;br /&gt;
* Erst nach erfolgreicher Antwort den nächsten fachlichen Zustand anzeigen.&lt;br /&gt;
* Ticketcodes und Pseudo-IDs nicht in der URL oder in dauerhaftem &amp;lt;code&amp;gt;localStorage&amp;lt;/code&amp;gt; speichern.&lt;br /&gt;
* Bei Seitenneuladung &amp;lt;code&amp;gt;/verify&amp;lt;/code&amp;gt; verwenden, bevor eine bestehende Sitzung angenommen wird.&lt;br /&gt;
* Eine Station erst als verbunden anzeigen, wenn &amp;lt;code&amp;gt;/media-station&amp;lt;/code&amp;gt; erfolgreich war.&lt;br /&gt;
* Bei &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; nicht automatisch einen falschen Code behaupten; auch Belegung und Projektzuordnung sind mögliche Ursachen.&lt;br /&gt;
* Bei unbekanntem Stationsstatus eine neutrale Fehlermeldung anzeigen.&lt;br /&gt;
* Bedienoberfläche tastaturbedienbar gestalten und Statusmeldungen mit &amp;lt;code&amp;gt;aria-live&amp;lt;/code&amp;gt; ausgeben.&lt;br /&gt;
* Stationsbefehle nur aus einer festen projektspezifischen Positivliste erzeugen, nicht aus frei eingegebenem Besuchertest.&lt;br /&gt;
&lt;br /&gt;
=== Ticketcode aus der URL entfernen ===&lt;br /&gt;
&lt;br /&gt;
Wird ein Ticketcode per QR-Link als Queryparameter übergeben, soll das Frontend ihn nach erfolgreicher Übernahme sofort aus der sichtbaren URL und der aktuellen Browserhistorie entfernen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const cleanUrl = new URL(window.location.href);&lt;br /&gt;
cleanUrl.searchParams.delete(&amp;quot;systemCode&amp;quot;);&lt;br /&gt;
window.history.replaceState({}, &amp;quot;&amp;quot;, cleanUrl.pathname + cleanUrl.search + cleanUrl.hash);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch wird der Code nicht unnötig in kopierten URLs oder späteren Screenshots weitergegeben. Webserver- und Proxy-Logs können den ursprünglichen Request trotzdem bereits enthalten; Ticketcodes bleiben deshalb kurzlebige Einmalwerte.&lt;br /&gt;
== CORS und Hosting ==&lt;br /&gt;
&lt;br /&gt;
Der aktuelle MegBes-Stand erlaubt CORS-Anfragen grundsätzlich. Das ist keine Zusage, dass jede zukünftige Instanz beliebige Origins akzeptiert. Bevorzugt werden Frontend und API unter kontrollierten HTTPS-Adressen betrieben. Ein CORS-Fehler wird nicht durch Abschalten von Browsersicherheit oder Zertifikatsprüfung umgangen.&lt;br /&gt;
&lt;br /&gt;
== Bestätigter Referenztest ==&lt;br /&gt;
&lt;br /&gt;
Am 6. August 2026 wurde der vollständige Ablauf gegen das interne Projekt &amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt; geprüft:&lt;br /&gt;
&lt;br /&gt;
 Frontend-Aufruf → megbes-external → megbes-internal → UDP-Versand&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;enter-system&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt;, Stationsanmeldung, &amp;lt;code&amp;gt;video-command&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;, Stationsabmeldung sowie erneutes &amp;lt;code&amp;gt;verify&amp;lt;/code&amp;gt; antworteten jeweils mit &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; bestätigte den UDP-Versand beider Befehle. Die Statusabfrage antwortete erwartungsgemäß mit &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt;, da &amp;lt;code&amp;gt;tine&amp;lt;/code&amp;gt; nicht im intern stationsgesteuerten Modus betrieben wird.&lt;br /&gt;
&lt;br /&gt;
Der Test bestätigt den Signalweg bis zum UDP-Versand. Der tatsächliche Empfang und die Reaktion eines Endgeräts müssen bei der Projektabnahme separat geprüft werden. Konkrete IP-Adressen, Ticketcodes und Geheimwerte werden nicht im Wiki festgehalten.&lt;br /&gt;
== Entwicklungs- und Abnahmetests ==&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;GET /info&amp;lt;/code&amp;gt; von der vorgesehenen Hardware aufrufen.&lt;br /&gt;
# korrekten Sicherheits- und Stationsmodus bestätigen.&lt;br /&gt;
# gültigen, ungültigen, bereits benutzten und abgelaufenen Ticketcode testen.&lt;br /&gt;
# freie, belegte und unbekannte Station testen.&lt;br /&gt;
# jeden freigegebenen Stationsbefehl einzeln prüfen.&lt;br /&gt;
# Mehrfachklick und parallele Requests testen.&lt;br /&gt;
# Abmeldung und erneute Anmeldung testen.&lt;br /&gt;
# Browser-Neuladen sowie Neustart von Frontend-Hardware und Station testen.&lt;br /&gt;
# Ausfall von External, Internal und Stationsnetz jeweils getrennt simulieren.&lt;br /&gt;
# sicherstellen, dass keine Tokens oder Geheimwerte in URL, Konsole, Screenshot oder sichtbarer Fehlermeldung erscheinen.&lt;br /&gt;
# installierten External-/Internal-Release, Frontend-Version und Testergebnis auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Grenzen dieser Referenz ==&lt;br /&gt;
&lt;br /&gt;
Diese Seite dokumentiert den API-Vertrag des aktuellen Repository-Stands. Projektspezifische Stationsbefehle, Gestaltung, Inhalte, Ticketdruck, Hardware-Autostart und konkrete Frontend-Dateipfade werden auf der jeweiligen Projektseite dokumentiert. Bei Abweichungen hat der tatsächlich eingesetzte Release Vorrang.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Web-Frontend]], [[Bedienung und Authentifizierung]], [[UDP und Stationszustände]], [[Client-Feedback und Stationsmeldungen]] und [[Routing und Signalweg]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Frontend]]&lt;br /&gt;
[[Kategorie:Entwicklung]]&lt;br /&gt;
[[Kategorie:API]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=DynDNS_und_Router&amp;diff=69</id>
		<title>DynDNS und Router</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=DynDNS_und_Router&amp;diff=69"/>
		<updated>2026-08-06T19:44:26Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Tabellenzeilen korrekt trennen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DynDNS und Router =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
`megbes-external` benötigt eine dauerhaft auflösbare Adresse und eine kontrollierte Weiterleitung zum lokalen `megbes-internal`. Bevorzugt wird IONOS DynDNS; No-IP bleibt eine Bestands- oder Ausweichlösung.&lt;br /&gt;
&lt;br /&gt;
== Planungswerte ==&lt;br /&gt;
* DynDNS-Hostname&lt;br /&gt;
* interner Server mit fester lokaler IP&lt;br /&gt;
* externer und interner TCP-Port&lt;br /&gt;
* Routermodell und zuständige Administration&lt;br /&gt;
* Sicherheitsmodus und Zertifikatszuordnung&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
# DynDNS-Namen projektspezifisch anlegen; geheime Update-URL ausschließlich im Passwortmanager speichern.&lt;br /&gt;
# Aktualisierungsmechanismus auf Router oder einem dauerhaft laufenden System einrichten.&lt;br /&gt;
# DNS-Auflösung von einem externen Anschluss prüfen.&lt;br /&gt;
# Am Router nur den benötigten TCP-Port auf die feste IP von `megbes-internal` weiterleiten.&lt;br /&gt;
# Keine DMZ-/Exposed-Host-Freigabe verwenden.&lt;br /&gt;
# Lokale und serverseitige Firewall prüfen.&lt;br /&gt;
# Verbindung von `megbes-external` bis `megbes-internal` mit Zertifikat testen.&lt;br /&gt;
&lt;br /&gt;
 nslookup &amp;lt;DynDNS-Hostname&amp;gt;&lt;br /&gt;
 sudo ss -lntup&lt;br /&gt;
&lt;br /&gt;
Eine Portprüfung aus dem internen Netz kann wegen fehlendem NAT-Loopback irreführend sein; extern testen.&lt;br /&gt;
&lt;br /&gt;
== FRITZ!Box ==&lt;br /&gt;
Unter Internet → Freigaben das Gerät anhand seiner festen IP auswählen und eine einzelne Portfreigabe für den projektspezifischen TCP-Port anlegen. Automatische Freigaben deaktiviert lassen, sofern sie nicht ausdrücklich benötigt werden.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fehlerbild !! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Hostname zeigt auf alte Adresse || DynDNS-Aktualisierung und öffentliche IP vergleichen&lt;br /&gt;
|-&lt;br /&gt;
| Port extern geschlossen || Routerfreigabe, Ziel-IP, Firewall und laufenden Container prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Verbindung erreicht falsches Projekt || Zielport und Containerzuordnung sofort korrigieren&lt;br /&gt;
|-&lt;br /&gt;
| TLS-Fehler || [[Zertifikate|Zertifikat]], Hostname und Vertrauenskette prüfen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dokumentation ==&lt;br /&gt;
Hostname, Routermodell, Portzuordnung, Ziel-IP, Änderungsdatum und Testergebnis auf der Projektseite festhalten. Update-URLs, Zugangsdaten und Schlüssel bleiben geheim.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Netzwerk]]&lt;br /&gt;
[[Kategorie:DynDNS]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Web-Frontend_entwickeln&amp;diff=68</id>
		<title>Web-Frontend entwickeln</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Web-Frontend_entwickeln&amp;diff=68"/>
		<updated>2026-08-06T19:43:44Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Tabellenzeilen korrekt trennen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Web-Frontend entwickeln =&lt;br /&gt;
&lt;br /&gt;
== Zweck und Geltungsbereich ==&lt;br /&gt;
&lt;br /&gt;
Diese Seite beschreibt die HTML-/JavaScript-Anbindung eines Web-Frontends an &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt;. Sie basiert auf den Controllern und Request-Modellen des aktuellen MegBes-Repositorys. Vor der Freigabe eines Frontends muss trotzdem geprüft werden, welcher MegBes-Release im betreffenden Projekt installiert ist.&lt;br /&gt;
&lt;br /&gt;
Das Frontend spricht ausschließlich &amp;lt;code&amp;gt;megbes-external&amp;lt;/code&amp;gt; an. Direkte Browseraufrufe an &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; sind nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
 Browser → HTTPS → megbes-external → megbes-internal → UDP → Station&lt;br /&gt;
&lt;br /&gt;
== Vor Beginn festlegen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wert&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| API-Basisadresse || HTTPS-Adresse der projektspezifischen External-Instanz&lt;br /&gt;
|-&lt;br /&gt;
| Projektkennung || Wert für &amp;lt;code&amp;gt;prSc&amp;lt;/code&amp;gt;; gegen den eingesetzten Release und die Projektkonfiguration prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Sicherheitsmodus || ohne Authentifizierung oder zentrale Ticket-/Benutzerauthentifizierung&lt;br /&gt;
|-&lt;br /&gt;
| Stationssteuerung || extern oder durch &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt; kontrolliert&lt;br /&gt;
|-&lt;br /&gt;
| Token-Header || Wert der Laufzeitkonfiguration &amp;lt;code&amp;gt;jwt.header&amp;lt;/code&amp;gt;; nicht pauschal &amp;lt;code&amp;gt;Authorization&amp;lt;/code&amp;gt; annehmen&lt;br /&gt;
|-&lt;br /&gt;
| Stationsnummern || freigegebene Stationen des Projekts&lt;br /&gt;
|-&lt;br /&gt;
| Stationsbefehle || projektspezifische Befehle, die die jeweilige Station tatsächlich versteht&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Domains, Headername, Projektkennung, Stationsnummern und Befehle dürfen nicht ungeprüft von einem anderen Projekt übernommen werden.&lt;br /&gt;
&lt;br /&gt;
== API-Übersicht ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Methode und Pfad&lt;br /&gt;
! Zweck&lt;br /&gt;
! Berechtigung&lt;br /&gt;
! Erfolgsantwort&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /info&amp;lt;/code&amp;gt; || vom Server empfangenen User-Agent prüfen || frei || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; mit User-Agent&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /authenticate&amp;lt;/code&amp;gt; || Ticket-Monitor administrativ authentifizieren || frei; benötigt Header &amp;lt;code&amp;gt;customer&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;id&amp;quot;: &amp;quot;...&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /verify-admin&amp;lt;/code&amp;gt; || Administrationskennung prüfen || ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /ticket&amp;lt;/code&amp;gt; || Ticketcode erzeugen oder vorhandenen unbenutzten Code abrufen || ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;id&amp;quot;: &amp;quot;......&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /enter-system&amp;lt;/code&amp;gt; || Ticketcode einmalig aktivieren || frei || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /verify&amp;lt;/code&amp;gt; || aktivierte Benutzerkennung prüfen || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /media-station?station=...&amp;lt;/code&amp;gt; || Benutzer an Station anmelden || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;GET /media-station/status/{stationNumber}&amp;lt;/code&amp;gt; || Stationszustand abrufen || USER oder ADMIN; nur bei intern kontrollierten Stationen || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;{ &amp;quot;stationStatus&amp;quot;: &amp;quot;...&amp;quot; }&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;POST /video-command&amp;lt;/code&amp;gt; || einen oder mehrere UDP-Befehle senden || ohne Security frei, sonst USER oder ADMIN || Antwort von &amp;lt;code&amp;gt;megbes-internal&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DELETE /media-station&amp;lt;/code&amp;gt; || Benutzer abmelden und Station zurücksetzen || USER oder ADMIN || &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wichtige Authentifizierungsregel ==&lt;br /&gt;
&lt;br /&gt;
MegBes liefert dem Browser beziehungsweise Ticket-Monitor eine &#039;&#039;&#039;Pseudo-ID&#039;&#039;&#039;. Der eigentliche JWT verbleibt serverseitig. Bei geschützten Folgeaufrufen sendet das Frontend die Pseudo-ID als Wert des projektspezifisch konfigurierten Token-Headers.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;konfigurierter-token-header&amp;gt;: &amp;lt;Pseudo-ID&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Headername stammt aus &amp;lt;code&amp;gt;jwt.header&amp;lt;/code&amp;gt;. Er darf im Frontend nicht geraten werden. Die Pseudo-ID ist wie eine Sitzungskennung zu behandeln: nicht protokollieren, nicht in URLs anhängen und nicht ins Wiki kopieren.&lt;br /&gt;
&lt;br /&gt;
== Request-Modelle ==&lt;br /&gt;
&lt;br /&gt;
=== System betreten ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /enter-system&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;systemCode&amp;quot;: &amp;quot;123456&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;systemCode&amp;lt;/code&amp;gt; darf nicht leer sein. Ein unbekannter oder bereits verwendeter Code ergibt &amp;lt;code&amp;gt;401 Unauthorized&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Stationsbefehl ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /video-command&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;prSc&amp;quot;: &amp;quot;&amp;lt;Projektkennung&amp;gt;&amp;quot;,&lt;br /&gt;
  &amp;quot;statNoCommands&amp;quot;: [&lt;br /&gt;
    &amp;quot;12-play&amp;quot;&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regeln des aktuellen Request-Modells:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;prSc&amp;lt;/code&amp;gt; ist Pflicht und darf nicht leer sein.&lt;br /&gt;
* &amp;lt;code&amp;gt;statNoCommands&amp;lt;/code&amp;gt; ist eine nicht leere Liste.&lt;br /&gt;
* Jeder Listeneintrag folgt &amp;lt;code&amp;gt;\d{0,3}-[0-9a-zA-Z]{2,20}&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Vor dem Bindestrich sind damit null bis drei Ziffern zulässig; für produktive Stationsbefehle soll eine eindeutige, im Projekt dokumentierte Stationsnummer verwendet werden.&lt;br /&gt;
* Nach dem Bindestrich sind zwei bis zwanzig ASCII-Buchstaben oder Ziffern zulässig.&lt;br /&gt;
* Ob ein formal gültiger Befehl fachlich unterstützt wird, entscheidet die jeweilige Stationssoftware.&lt;br /&gt;
&lt;br /&gt;
Beispiele wie &amp;lt;code&amp;gt;12-play&amp;lt;/code&amp;gt; sind nur Formbeispiele und keine globale MegBes-Befehlsliste.&lt;br /&gt;
&lt;br /&gt;
== Empfohlener JavaScript-API-Client ==&lt;br /&gt;
&lt;br /&gt;
Die Netzwerkanbindung soll an einer Stelle gekapselt werden. Dadurch bleiben Fehlerbehandlung, Header und JSON-Verarbeitung konsistent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const megBesConfig = Object.freeze({&lt;br /&gt;
  apiBase: &amp;quot;https://&amp;lt;projekt&amp;gt;.megbes.de&amp;quot;,&lt;br /&gt;
  projectCode: &amp;quot;&amp;lt;PROJEKTKENNUNG&amp;gt;&amp;quot;,&lt;br /&gt;
  tokenHeader: &amp;quot;&amp;lt;WERT-AUS-jwt.header&amp;gt;&amp;quot;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
class MegBesError extends Error {&lt;br /&gt;
  constructor(message, status, responseBody) {&lt;br /&gt;
    super(message);&lt;br /&gt;
    this.name = &amp;quot;MegBesError&amp;quot;;&lt;br /&gt;
    this.status = status;&lt;br /&gt;
    this.responseBody = responseBody;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function megBesRequest(path, {&lt;br /&gt;
  method = &amp;quot;GET&amp;quot;,&lt;br /&gt;
  token = null,&lt;br /&gt;
  body = undefined,&lt;br /&gt;
  headers = {}&lt;br /&gt;
} = {}) {&lt;br /&gt;
  const requestHeaders = new Headers(headers);&lt;br /&gt;
&lt;br /&gt;
  if (token) {&lt;br /&gt;
    requestHeaders.set(megBesConfig.tokenHeader, token);&lt;br /&gt;
  }&lt;br /&gt;
  if (body !== undefined) {&lt;br /&gt;
    requestHeaders.set(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/json&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  let response;&lt;br /&gt;
  try {&lt;br /&gt;
    response = await fetch(`${megBesConfig.apiBase}${path}`, {&lt;br /&gt;
      method,&lt;br /&gt;
      headers: requestHeaders,&lt;br /&gt;
      body: body === undefined ? undefined : JSON.stringify(body),&lt;br /&gt;
      cache: &amp;quot;no-store&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
  } catch (cause) {&lt;br /&gt;
    throw new MegBesError(&amp;quot;MegBes ist nicht erreichbar.&amp;quot;, 0, cause);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const contentType = response.headers.get(&amp;quot;content-type&amp;quot;) || &amp;quot;&amp;quot;;&lt;br /&gt;
  const responseBody = contentType.includes(&amp;quot;application/json&amp;quot;)&lt;br /&gt;
    ? await response.json()&lt;br /&gt;
    : await response.text();&lt;br /&gt;
&lt;br /&gt;
  if (!response.ok) {&lt;br /&gt;
    throw new MegBesError(&lt;br /&gt;
      `MegBes-Aufruf fehlgeschlagen (${response.status}).`,&lt;br /&gt;
      response.status,&lt;br /&gt;
      responseBody&lt;br /&gt;
    );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return responseBody;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variante A: Frontend ohne Authentifizierung ==&lt;br /&gt;
&lt;br /&gt;
Diese Variante existiert nur, wenn &amp;lt;code&amp;gt;megbes.security&amp;lt;/code&amp;gt; für die External-Instanz nicht aktiviert ist. Das Frontend darf diesen Modus nicht anhand eines fehlgeschlagenen Loginversuchs erraten; er wird vor der Entwicklung projektspezifisch festgelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function sendCommandWithoutAuthentication(station, command) {&lt;br /&gt;
  return megBesRequest(&amp;quot;/video-command&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    body: {&lt;br /&gt;
      prSc: megBesConfig.projectCode,&lt;br /&gt;
      statNoCommands: [`${station}-${command}`]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auch ohne MegBes-Authentifizierung muss die External-Instanz ausschließlich über HTTPS angesprochen werden. Welche Personen die Seite erreichen dürfen, ist außerhalb von MegBes abzusichern.&lt;br /&gt;
&lt;br /&gt;
== Variante B: Ticket-Monitor ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Ticket-Monitor authentifizieren ===&lt;br /&gt;
&lt;br /&gt;
Der Ticket-Monitor ruft &amp;lt;code&amp;gt;POST /authenticate&amp;lt;/code&amp;gt; mit den Headern &amp;lt;code&amp;gt;customer&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; auf. Zusätzlich prüft MegBes den User-Agent gegen die Projektkonfiguration.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function authenticateTicketMonitor(customer, authId) {&lt;br /&gt;
  const response = await megBesRequest(&amp;quot;/authenticate&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    headers: {&lt;br /&gt;
      customer,&lt;br /&gt;
      authId&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  return response.id;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;authId&amp;lt;/code&amp;gt; ist ein Geheimwert und darf nicht fest in ausgelieferter Browser-JavaScript-Datei stehen. Wenn der Ticket-Monitor nur statische öffentliche Dateien ausliefert, ist dieses Verfahren sicherheitlich neu zu bewerten. Die Kennung gehört in eine geschützte Laufzeitumgebung oder einen vertrauenswürdigen lokalen Dienst.&lt;br /&gt;
&lt;br /&gt;
=== 2. Ticketcode abrufen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function getTicket(adminToken, customer, ticketMonitorNumber) {&lt;br /&gt;
  const query = new URLSearchParams({&lt;br /&gt;
    customer,&lt;br /&gt;
    ticketMonitorNumber: String(ticketMonitorNumber)&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
  const response = await megBesRequest(`/ticket?${query}`, {&lt;br /&gt;
    token: adminToken&lt;br /&gt;
  });&lt;br /&gt;
  return response.id;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der gelieferte Code ist im aktuellen Stand sechsstellig. Das Frontend soll ihn als String behandeln, damit eine führende Null nicht verloren geht.&lt;br /&gt;
&lt;br /&gt;
== Variante C: Besucher- oder Guide-Frontend mit Ticketcode ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Code aktivieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function enterSystem(systemCode) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/enter-system&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    body: { systemCode }&lt;br /&gt;
  });&lt;br /&gt;
  return systemCode;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach erfolgreichem Eintritt dient derselbe Code als Pseudo-ID für die weiteren Aufrufe. Ein Ticketcode kann nur einmal aktiviert werden.&lt;br /&gt;
&lt;br /&gt;
=== 2. Kennung prüfen ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function verifyUser(userToken) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/verify&amp;quot;, { token: userToken });&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. An Station anmelden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function loginStation(userToken, stationNumber) {&lt;br /&gt;
  const query = new URLSearchParams({ station: String(stationNumber) });&lt;br /&gt;
  await megBesRequest(`/media-station?${query}`, { token: userToken });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im intern kontrollierten Modus ist die Stationsnummer zwingend. Ein &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; kann neben einer ungültigen Kennung auch bedeuten, dass die Station belegt ist oder die Stationsanmeldung abgelehnt wurde. Die Bedienoberfläche darf deshalb nicht automatisch behaupten, der Ticketcode sei falsch.&lt;br /&gt;
&lt;br /&gt;
=== 4. Optional Stationsstatus prüfen ===&lt;br /&gt;
&lt;br /&gt;
Dieser Endpunkt ist nur verfügbar, wenn &amp;lt;code&amp;gt;megbes.internal.station.controlled=true&amp;lt;/code&amp;gt; gilt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function getStationStatus(userToken, stationNumber) {&lt;br /&gt;
  const response = await megBesRequest(&lt;br /&gt;
    `/media-station/status/${encodeURIComponent(stationNumber)}`,&lt;br /&gt;
    { token: userToken }&lt;br /&gt;
  );&lt;br /&gt;
  return response.stationStatus;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Code verwendet unter anderem die Zustände &amp;lt;code&amp;gt;OPEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IDLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;REMOTE&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;TOUCHSCREEN&amp;lt;/code&amp;gt;. Die Oberfläche soll unbekannte künftige Werte neutral anzeigen und nicht abstürzen.&lt;br /&gt;
&lt;br /&gt;
=== 5. Befehl senden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function sendCommand(userToken, stationNumber, command) {&lt;br /&gt;
  return megBesRequest(&amp;quot;/video-command&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;POST&amp;quot;,&lt;br /&gt;
    token: userToken,&lt;br /&gt;
    body: {&lt;br /&gt;
      prSc: megBesConfig.projectCode,&lt;br /&gt;
      statNoCommands: [`${stationNumber}-${command}`]&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. Station abmelden ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
async function logoutStation(userToken) {&lt;br /&gt;
  await megBesRequest(&amp;quot;/media-station&amp;quot;, {&lt;br /&gt;
    method: &amp;quot;DELETE&amp;quot;,&lt;br /&gt;
    token: userToken&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abmeldung soll über eine sichtbare Bedienhandlung und bei regulärem Abschluss erfolgen. Ein Aufruf in &amp;lt;code&amp;gt;beforeunload&amp;lt;/code&amp;gt; ist allein nicht zuverlässig, da Browser ausstehende Requests beim Schließen abbrechen können. Der projektspezifische Stations-Timer bleibt daher als Rückfallebene erforderlich.&lt;br /&gt;
&lt;br /&gt;
== Vollständiger Ablauf eines Besucher-Frontends ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let userToken = null;&lt;br /&gt;
let activeStation = null;&lt;br /&gt;
&lt;br /&gt;
async function startSession(systemCode, stationNumber) {&lt;br /&gt;
  userToken = await enterSystem(systemCode);&lt;br /&gt;
  await verifyUser(userToken);&lt;br /&gt;
&lt;br /&gt;
  // Nur im intern kontrollierten Modus vorab verwenden.&lt;br /&gt;
  // const status = await getStationStatus(userToken, stationNumber);&lt;br /&gt;
&lt;br /&gt;
  await loginStation(userToken, stationNumber);&lt;br /&gt;
  activeStation = String(stationNumber);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function play(command) {&lt;br /&gt;
  if (!userToken || !activeStation) {&lt;br /&gt;
    throw new Error(&amp;quot;Keine aktive MegBes-Station.&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  await sendCommand(userToken, activeStation, command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function endSession() {&lt;br /&gt;
  if (userToken &amp;amp;&amp;amp; activeStation) {&lt;br /&gt;
    await logoutStation(userToken);&lt;br /&gt;
  }&lt;br /&gt;
  userToken = null;&lt;br /&gt;
  activeStation = null;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Minimales HTML-Beispiel ==&lt;br /&gt;
&lt;br /&gt;
Das Beispiel zeigt die Struktur, ist aber ohne projektspezifische Werte und Gestaltung nicht produktionsfertig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;title&amp;gt;MegBes-Steuerung&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;main&amp;gt;&lt;br /&gt;
    &amp;lt;form id=&amp;quot;login-form&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;label for=&amp;quot;code&amp;quot;&amp;gt;Ticketcode&amp;lt;/label&amp;gt;&lt;br /&gt;
      &amp;lt;input id=&amp;quot;code&amp;quot; name=&amp;quot;code&amp;quot; inputmode=&amp;quot;numeric&amp;quot; autocomplete=&amp;quot;one-time-code&amp;quot; required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;label for=&amp;quot;station&amp;quot;&amp;gt;Station&amp;lt;/label&amp;gt;&lt;br /&gt;
      &amp;lt;input id=&amp;quot;station&amp;quot; name=&amp;quot;station&amp;quot; inputmode=&amp;quot;numeric&amp;quot; required&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Station verbinden&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;section id=&amp;quot;controls&amp;quot; hidden&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; data-command=&amp;quot;play&amp;quot;&amp;gt;Start&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; data-command=&amp;quot;stop&amp;quot;&amp;gt;Stopp&amp;lt;/button&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; id=&amp;quot;logout&amp;quot;&amp;gt;Beenden&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p id=&amp;quot;message&amp;quot; role=&amp;quot;status&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/main&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;script src=&amp;quot;megbes-api.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    const form = document.querySelector(&amp;quot;#login-form&amp;quot;);&lt;br /&gt;
    const controls = document.querySelector(&amp;quot;#controls&amp;quot;);&lt;br /&gt;
    const message = document.querySelector(&amp;quot;#message&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    form.addEventListener(&amp;quot;submit&amp;quot;, async event =&amp;gt; {&lt;br /&gt;
      event.preventDefault();&lt;br /&gt;
      message.textContent = &amp;quot;Verbindung wird hergestellt ...&amp;quot;;&lt;br /&gt;
      try {&lt;br /&gt;
        await startSession(form.code.value.trim(), form.station.value.trim());&lt;br /&gt;
        controls.hidden = false;&lt;br /&gt;
        message.textContent = &amp;quot;Station ist verbunden.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    controls.addEventListener(&amp;quot;click&amp;quot;, async event =&amp;gt; {&lt;br /&gt;
      const command = event.target.dataset.command;&lt;br /&gt;
      if (!command) return;&lt;br /&gt;
      try {&lt;br /&gt;
        event.target.disabled = true;&lt;br /&gt;
        await play(command);&lt;br /&gt;
        message.textContent = &amp;quot;Befehl wurde gesendet.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      } finally {&lt;br /&gt;
        event.target.disabled = false;&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    document.querySelector(&amp;quot;#logout&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, async () =&amp;gt; {&lt;br /&gt;
      try {&lt;br /&gt;
        await endSession();&lt;br /&gt;
        controls.hidden = true;&lt;br /&gt;
        form.reset();&lt;br /&gt;
        message.textContent = &amp;quot;Sitzung wurde beendet.&amp;quot;;&lt;br /&gt;
      } catch (error) {&lt;br /&gt;
        message.textContent = messageForMegBesError(error);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die sichtbaren Befehle &amp;lt;code&amp;gt;play&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; sind ebenfalls nur Platzhalter. Sie werden durch die freigegebenen Projektbefehle ersetzt.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function messageForMegBesError(error) {&lt;br /&gt;
  if (!(error instanceof MegBesError)) {&lt;br /&gt;
    return &amp;quot;Unerwarteter Fehler. Bitte Aufsicht informieren.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  switch (error.status) {&lt;br /&gt;
    case 0:&lt;br /&gt;
      return &amp;quot;MegBes ist derzeit nicht erreichbar.&amp;quot;;&lt;br /&gt;
    case 400:&lt;br /&gt;
      return &amp;quot;Die Anfrage ist unvollständig oder ungültig.&amp;quot;;&lt;br /&gt;
    case 401:&lt;br /&gt;
      return &amp;quot;Anmeldung, Berechtigung oder Stationsbelegung konnte nicht bestätigt werden.&amp;quot;;&lt;br /&gt;
    case 403:&lt;br /&gt;
      return &amp;quot;Die Station ist für diese Sitzung nicht freigegeben.&amp;quot;;&lt;br /&gt;
    case 404:&lt;br /&gt;
      return &amp;quot;Diese Funktion ist in der aktuellen Betriebsart nicht verfügbar.&amp;quot;;&lt;br /&gt;
    default:&lt;br /&gt;
      return &amp;quot;MegBes konnte den Auftrag nicht ausführen.&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keine rohen Backend-Antworten, Stacktraces, Tokens oder internen Adressen an Besucher ausgeben. Technische Details gehören in eine geschützte Diagnoseansicht oder in bereinigte Logs.&lt;br /&gt;
&lt;br /&gt;
== Zustands- und Bedienregeln ==&lt;br /&gt;
&lt;br /&gt;
* Mehrfachklicks verhindern, solange ein Request läuft.&lt;br /&gt;
* Erst nach erfolgreicher Antwort den nächsten fachlichen Zustand anzeigen.&lt;br /&gt;
* Ticketcodes und Pseudo-IDs nicht in der URL oder in dauerhaftem &amp;lt;code&amp;gt;localStorage&amp;lt;/code&amp;gt; speichern.&lt;br /&gt;
* Bei Seitenneuladung &amp;lt;code&amp;gt;/verify&amp;lt;/code&amp;gt; verwenden, bevor eine bestehende Sitzung angenommen wird.&lt;br /&gt;
* Eine Station erst als verbunden anzeigen, wenn &amp;lt;code&amp;gt;/media-station&amp;lt;/code&amp;gt; erfolgreich war.&lt;br /&gt;
* Bei &amp;lt;code&amp;gt;401&amp;lt;/code&amp;gt; nicht automatisch einen falschen Code behaupten; auch Belegung und Projektzuordnung sind mögliche Ursachen.&lt;br /&gt;
* Bei unbekanntem Stationsstatus eine neutrale Fehlermeldung anzeigen.&lt;br /&gt;
* Bedienoberfläche tastaturbedienbar gestalten und Statusmeldungen mit &amp;lt;code&amp;gt;aria-live&amp;lt;/code&amp;gt; ausgeben.&lt;br /&gt;
* Stationsbefehle nur aus einer festen projektspezifischen Positivliste erzeugen, nicht aus frei eingegebenem Besuchertest.&lt;br /&gt;
&lt;br /&gt;
== CORS und Hosting ==&lt;br /&gt;
&lt;br /&gt;
Der aktuelle MegBes-Stand erlaubt CORS-Anfragen grundsätzlich. Das ist keine Zusage, dass jede zukünftige Instanz beliebige Origins akzeptiert. Bevorzugt werden Frontend und API unter kontrollierten HTTPS-Adressen betrieben. Ein CORS-Fehler wird nicht durch Abschalten von Browsersicherheit oder Zertifikatsprüfung umgangen.&lt;br /&gt;
&lt;br /&gt;
== Entwicklungs- und Abnahmetests ==&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;GET /info&amp;lt;/code&amp;gt; von der vorgesehenen Hardware aufrufen.&lt;br /&gt;
# korrekten Sicherheits- und Stationsmodus bestätigen.&lt;br /&gt;
# gültigen, ungültigen, bereits benutzten und abgelaufenen Ticketcode testen.&lt;br /&gt;
# freie, belegte und unbekannte Station testen.&lt;br /&gt;
# jeden freigegebenen Stationsbefehl einzeln prüfen.&lt;br /&gt;
# Mehrfachklick und parallele Requests testen.&lt;br /&gt;
# Abmeldung und erneute Anmeldung testen.&lt;br /&gt;
# Browser-Neuladen sowie Neustart von Frontend-Hardware und Station testen.&lt;br /&gt;
# Ausfall von External, Internal und Stationsnetz jeweils getrennt simulieren.&lt;br /&gt;
# sicherstellen, dass keine Tokens oder Geheimwerte in URL, Konsole, Screenshot oder sichtbarer Fehlermeldung erscheinen.&lt;br /&gt;
# installierten External-/Internal-Release, Frontend-Version und Testergebnis auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Grenzen dieser Referenz ==&lt;br /&gt;
&lt;br /&gt;
Diese Seite dokumentiert den API-Vertrag des aktuellen Repository-Stands. Projektspezifische Stationsbefehle, Gestaltung, Inhalte, Ticketdruck, Hardware-Autostart und konkrete Frontend-Dateipfade werden auf der jeweiligen Projektseite dokumentiert. Bei Abweichungen hat der tatsächlich eingesetzte Release Vorrang.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[Web-Frontend]], [[Bedienung und Authentifizierung]], [[UDP und Stationszustände]], [[Client-Feedback und Stationsmeldungen]] und [[Routing und Signalweg]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Frontend]]&lt;br /&gt;
[[Kategorie:Entwicklung]]&lt;br /&gt;
[[Kategorie:API]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Wartung,_Backups_und_Fehlerdiagnose&amp;diff=67</id>
		<title>Wartung, Backups und Fehlerdiagnose</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Wartung,_Backups_und_Fehlerdiagnose&amp;diff=67"/>
		<updated>2026-08-06T19:43:44Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Tabellenzeilen korrekt trennen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wartung, Backups und Fehlerdiagnose =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
Regelmäßige Wartung hält zentrale und lokale MegBes-Komponenten sicher, nachvollziehbar und wiederherstellbar. Änderungen erfolgen projektweise und mit dokumentiertem Rückkehrweg.&lt;br /&gt;
&lt;br /&gt;
== Regelmäßige Kontrollen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bereich&lt;br /&gt;
! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Container || Laufzustand, Neustarts und aktuelle Fehler im Log&lt;br /&gt;
|-&lt;br /&gt;
| Betriebssystem || verfügbare Sicherheitsaktualisierungen und freier Speicherplatz&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerk || Erreichbarkeit, DynDNS-Auflösung und Routerweiterleitung&lt;br /&gt;
|-&lt;br /&gt;
| Zertifikate || Gültigkeitsende und korrekte Projektzuordnung&lt;br /&gt;
|-&lt;br /&gt;
| MegBes-Release || installierter Stand gegenüber freigegebenem Stand&lt;br /&gt;
|-&lt;br /&gt;
| Medienstationen || Erreichbarkeit, Rückmeldungen und automatischer Wiederanlauf&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation || Übereinstimmung von Projektseite und tatsächlichem System&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vor einer Änderung sichern ==&lt;br /&gt;
&lt;br /&gt;
Zu erfassen beziehungsweise zu sichern sind mindestens:&lt;br /&gt;
&lt;br /&gt;
* projektspezifische Konfiguration ohne ungeschützte Weitergabe von Geheimwerten&lt;br /&gt;
* Containerdefinition, Portzuordnungen und Dateimounts&lt;br /&gt;
* aktuell eingesetzter MegBes-Release&lt;br /&gt;
* Zertifikats- und Keystore-Dateien in geschützter Ablage&lt;br /&gt;
* kundenspezifische Skripte und Stationssoftware&lt;br /&gt;
* für Raspberry-Pi-Stationen gegebenenfalls ein geprüftes SD-Karten-Abbild&lt;br /&gt;
* Datum, Anlass und verantwortliche Person der Sicherung&lt;br /&gt;
&lt;br /&gt;
Eine Sicherung gilt erst als belastbar, wenn Ablageort, Lesbarkeit und vorgesehener Wiederherstellungsweg geprüft wurden.&lt;br /&gt;
&lt;br /&gt;
== Sicherer Wartungsablauf ==&lt;br /&gt;
&lt;br /&gt;
# Istzustand und konkrete Störung beziehungsweise Wartungsaufgabe dokumentieren.&lt;br /&gt;
# Projektbezogene Konfiguration und Release feststellen.&lt;br /&gt;
# Rückkehrweg und benötigte Sicherungen vorbereiten.&lt;br /&gt;
# Änderung nur an einer klar abgegrenzten Stufe durchführen.&lt;br /&gt;
# Logs und unmittelbare Erfolgskriterien prüfen.&lt;br /&gt;
# Gesamten Signalweg mit einem kontrollierten Test durchlaufen.&lt;br /&gt;
# Stationszustände und Wiederanlauf prüfen.&lt;br /&gt;
# Ergebnis und neuen Istzustand auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Fehlerdiagnose nach Ebenen ==&lt;br /&gt;
&lt;br /&gt;
# Bedienoberfläche und Authentifizierung&lt;br /&gt;
# `megbes-external` und dessen Containerlog&lt;br /&gt;
# DNS, DynDNS und öffentliches Routing&lt;br /&gt;
# Router, Portweiterleitung und lokale Firewall&lt;br /&gt;
# `megbes-internal` und dessen Anwendungslog&lt;br /&gt;
# UDP-Weg im Ausstellungsnetz&lt;br /&gt;
# Medienstation, Empfängersoftware und konkrete Befehle&lt;br /&gt;
&lt;br /&gt;
Details: [[Routing und Signalweg]].&lt;br /&gt;
&lt;br /&gt;
== Sichere Abbruchpunkte ==&lt;br /&gt;
&lt;br /&gt;
Die Arbeit wird abgebrochen und der letzte bekannte Zustand wiederhergestellt, wenn die Projektzuordnung unklar ist, eine Änderung mehrere Kundencontainer unerwartet betrifft, Geheimwerte fehlen oder nicht eindeutig zugeordnet sind, keine belastbare Sicherung existiert oder sich der bisherige Release nicht bestimmen lässt.&lt;br /&gt;
&lt;br /&gt;
== Nachkontrolle ==&lt;br /&gt;
&lt;br /&gt;
* öffentliche Anwendung erreichbar&lt;br /&gt;
* interner Server erreichbar&lt;br /&gt;
* mindestens ein repräsentativer Steuerbefehl erfolgreich&lt;br /&gt;
* Rückmeldung einer stationsgesteuerten Station erfolgreich&lt;br /&gt;
* keine neue Fehlerserie in den Logs&lt;br /&gt;
* Dokumentation und tatsächlicher Zustand stimmen überein&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Wartung]]&lt;br /&gt;
[[Kategorie:Fehlerdiagnose]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Zertifikate&amp;diff=66</id>
		<title>Zertifikate</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Zertifikate&amp;diff=66"/>
		<updated>2026-08-06T19:43:44Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Tabellenzeilen korrekt trennen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Zertifikate =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
MegBes kann die Verbindung zwischen `megbes-external`, Status-Monitor und `megbes-internal` mit Client-Zertifikaten absichern. Zertifikate identifizieren einen berechtigten Client; der zugehörige private Schlüssel muss geschützt bleiben.&lt;br /&gt;
&lt;br /&gt;
== Bestandteile ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bestandteil&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| Zertifikat || Öffentlicher Identitätsnachweis des Clients.&lt;br /&gt;
|-&lt;br /&gt;
| privater Schlüssel || Geheimer Schlüssel; darf nicht ins Wiki oder in ungeschützte Ablagen gelangen.&lt;br /&gt;
|-&lt;br /&gt;
| Keystore || Datei, die Zertifikat und privaten Schlüssel für eine Anwendung bereitstellen kann.&lt;br /&gt;
|-&lt;br /&gt;
| Keystore-Passwort || Geheimwert zum Schutz des Keystores.&lt;br /&gt;
|-&lt;br /&gt;
| Vertrauenskonfiguration || Legt fest, welchen Gegenstellen beziehungsweise Ausstellern vertraut wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Erstellung über den Status-Monitor ==&lt;br /&gt;
&lt;br /&gt;
Der aktuelle Status-Monitor enthält Funktionen zum Erstellen, Anzeigen, Installieren und Löschen von Zertifikaten. Die Oberfläche soll bevorzugt verwendet werden, weil sie die projektspezifische Zuordnung nachvollziehbar hält.&lt;br /&gt;
&lt;br /&gt;
# Im Status-Monitor mit einem berechtigten Administrationskonto anmelden.&lt;br /&gt;
# Zertifikatsbereich öffnen und das korrekte Projekt auswählen.&lt;br /&gt;
# Neues Zertifikat mit einer eindeutigen, projektbezogenen Bezeichnung erstellen.&lt;br /&gt;
# Erzeugte Dateien unmittelbar in der vorgesehenen geschützten Ablage sichern.&lt;br /&gt;
# Zertifikat beziehungsweise Keystore der vorgesehenen MegBes-Komponente zuordnen.&lt;br /&gt;
# Anwendung kontrolliert neu starten und das Startprotokoll prüfen.&lt;br /&gt;
# Verbindung zwischen externer und interner Komponente testen.&lt;br /&gt;
# Bezeichnung, Einsatzzweck, Gültigkeitszeitraum und Ablageort ohne Geheimwerte auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Funktionsprüfung ==&lt;br /&gt;
&lt;br /&gt;
* Die beteiligten Anwendungen starten ohne Keystore- oder TLS-Fehler.&lt;br /&gt;
* Der vorgesehene Client kann den geschützten Endpunkt erreichen.&lt;br /&gt;
* Ein nicht autorisierter Aufruf wird abgewiesen.&lt;br /&gt;
* Das eingesetzte Zertifikat ist dem richtigen Projekt zugeordnet und noch gültig.&lt;br /&gt;
&lt;br /&gt;
== Erneuerung ==&lt;br /&gt;
&lt;br /&gt;
Zertifikate sollen vor Ablauf erneuert werden. Das neue Zertifikat wird bereitgestellt und getestet, bevor das alte entfernt wird. Bei einer Störung muss der vorherige Zustand wiederherstellbar bleiben.&lt;br /&gt;
&lt;br /&gt;
== Typische Fehler ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fehlerbild&lt;br /&gt;
! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Anwendung startet nicht || Keystore-Pfad, Dateirechte, Passwortzuordnung und Dateiformat prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| TLS-Verbindung wird abgelehnt || Gültigkeit, Client-Zuordnung und Vertrauenskette prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Falsches Projekt betroffen || Zertifikatsbezeichnung und Container-/Projektzuordnung prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Funktion endet nach Zertifikatswechsel || Altes Zertifikat nicht löschen; zunächst Konfiguration zurücksetzen und Logs vergleichen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sicherheitsregeln ==&lt;br /&gt;
&lt;br /&gt;
* Private Schlüssel und Keystore-Passwörter niemals ins Wiki kopieren.&lt;br /&gt;
* Zertifikatsdateien nicht über ungeschützte Kommunikationswege übertragen.&lt;br /&gt;
* Keine produktiven Zertifikate in Beispielkonfigurationen oder öffentliche Repositories übernehmen.&lt;br /&gt;
* Verlust oder vermutete Offenlegung als Sicherheitsvorfall behandeln und das Zertifikat ersetzen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Megbes-external_unter_Plesk&amp;diff=65</id>
		<title>Megbes-external unter Plesk</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Megbes-external_unter_Plesk&amp;diff=65"/>
		<updated>2026-08-06T19:43:44Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Tabellenzeilen korrekt trennen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Megbes-external unter Plesk =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
`megbes-external` bildet die öffentlich erreichbare Ebene von MegBes. Auf dem zentralen IONOS-Server wird für jedes Kundenprojekt ein eigener Docker-Container über Plesk betrieben. Die Trennung verhindert, dass projektspezifische Domains, Ports, Konfigurationen und Releases unkontrolliert vermischt werden.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
&lt;br /&gt;
* Projekt ist nach [[Neukunde]] angelegt.&lt;br /&gt;
* Passende Konfiguration liegt im privaten Repository `tinetronics/megbes-config` vor.&lt;br /&gt;
* Freier externer Port und vorgesehene Domain beziehungsweise Subdomain sind festgelegt.&lt;br /&gt;
* Das freigegebene MegBes-Release ist bekannt.&lt;br /&gt;
* Adresse und Erreichbarkeit von `megbes-internal` sind geklärt.&lt;br /&gt;
* Benötigte Zertifikate sind vorhanden; siehe [[Zertifikate]].&lt;br /&gt;
&lt;br /&gt;
== Grundaufbau je Projekt ==&lt;br /&gt;
&lt;br /&gt;
Für jedes Projekt werden getrennt dokumentiert:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Angabe&lt;br /&gt;
! Dokumentationsort&lt;br /&gt;
|-&lt;br /&gt;
| Projekt- und Containername || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| Domain oder Subdomain || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| externe Portzuordnung || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| verwendete Konfigurationsdatei || Projektseite, ohne Geheimwerte&lt;br /&gt;
|-&lt;br /&gt;
| installierter Release || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| Betriebsart und Authentifizierungsvariante || Projektseite&lt;br /&gt;
|-&lt;br /&gt;
| Adresse des internen Servers || Projektseite&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ablauf in Plesk ==&lt;br /&gt;
&lt;br /&gt;
# Vorhandene Container prüfen und einen eindeutigen Projektnamen wählen.&lt;br /&gt;
# Den für das Projekt freigegebenen Image- beziehungsweise Release-Stand auswählen.&lt;br /&gt;
# Projektspezifische Umgebungsvariablen und benötigte Dateimounts eintragen.&lt;br /&gt;
# Portzuordnung so wählen, dass sie nicht mit einem bestehenden Container kollidiert.&lt;br /&gt;
# Domain oder Subdomain auf den vorgesehenen Container beziehungsweise Port routen.&lt;br /&gt;
# Falls erforderlich, Zertifikatsdateien ausschließlich aus der geschützten Ablage einbinden.&lt;br /&gt;
# Container starten und Startprotokoll auf Konfigurations-, Port- und Zertifikatsfehler prüfen.&lt;br /&gt;
# Erreichbarkeit der öffentlichen Anwendung testen.&lt;br /&gt;
# Einen kontrollierten Aufruf bis `megbes-internal` durchführen; siehe [[Routing und Signalweg]].&lt;br /&gt;
# Alle nicht geheimen Istwerte auf der Projektseite dokumentieren.&lt;br /&gt;
&lt;br /&gt;
== Erfolgskriterien ==&lt;br /&gt;
&lt;br /&gt;
* Der Container läuft ohne Neustartschleife.&lt;br /&gt;
* Die projektbezogene Domain liefert die vorgesehene Anwendung.&lt;br /&gt;
* Das Log enthält keine ungelösten Konfigurations- oder Zertifikatsfehler.&lt;br /&gt;
* `megbes-external` erreicht den korrekten internen Server.&lt;br /&gt;
* Ein Testbefehl erreicht ausschließlich das vorgesehene Projekt.&lt;br /&gt;
&lt;br /&gt;
== Sichere Änderungen und Updates ==&lt;br /&gt;
&lt;br /&gt;
Vor einer Änderung sind Containername, Portbelegung, eingebundene Dateien, Konfiguration und aktueller Release zu erfassen. Updates werden zunächst gegen die projektspezifische Konfiguration geprüft. Ein bestehender Container darf erst ersetzt werden, wenn Rückkehrweg und bisheriger Release bekannt sind.&lt;br /&gt;
&lt;br /&gt;
== Typische Fehler ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fehlerbild&lt;br /&gt;
! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Container startet wiederholt neu || Startlog, Konfigurationsdatei, Mounts und Umgebungsvariablen prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Domain ist nicht erreichbar || DNS, Plesk-Routing, Portzuordnung und Containerstatus prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Anwendung ist erreichbar, interner Server nicht || Zieladresse, DynDNS, Routerfreigabe und Zertifikate prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Falsches Projekt reagiert || Domain-, Port- und Containerzuordnung sofort prüfen; keinen weiteren Funktionstest senden.&lt;br /&gt;
|-&lt;br /&gt;
| Zertifikatsfehler || Dateipfad, Gültigkeit und Zuordnung nach [[Zertifikate]] prüfen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sicherheitsregeln ==&lt;br /&gt;
&lt;br /&gt;
Passwörter, Tokens, private Schlüssel, geheime Headerwerte und vollständige Zugangsdaten dürfen weder auf der Wiki-Seite noch in Befehlsbeispielen stehen. Das Wiki dokumentiert Bezeichnungen, Ablageorte und Zuständigkeiten, nicht die Geheimwerte selbst.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Betrieb]]&lt;br /&gt;
[[Kategorie:Plesk]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Client-Feedback_und_Stationsmeldungen&amp;diff=64</id>
		<title>Client-Feedback und Stationsmeldungen</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Client-Feedback_und_Stationsmeldungen&amp;diff=64"/>
		<updated>2026-08-06T19:43:44Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Tabellenzeilen korrekt trennen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Client-Feedback und Stationsmeldungen =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
Medienstationen können ihren Start und – bei stationsgesteuerten Projekten – ihren aktuellen Nutzungszustand per UDP an `megbes-internal` melden. Diese Rückmeldungen ermöglichen Betriebsinformationen und verhindern, dass zwei Bedienwege dieselbe Station gleichzeitig übernehmen.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
&lt;br /&gt;
* Die Medienstation erreicht den lokalen Server im Ausstellungsnetz.&lt;br /&gt;
* Zieladresse und UDP-Port entsprechen der Projektkonfiguration.&lt;br /&gt;
* Bei Nutzung von Stationszuständen ist der stationsgesteuerte Modus auf interner und externer Ebene aktiviert.&lt;br /&gt;
* Die Stationsnummer stimmt mit der Projektkonfiguration überein.&lt;br /&gt;
&lt;br /&gt;
== Init-Meldung ==&lt;br /&gt;
&lt;br /&gt;
Eine Nachricht, die mit `init` beginnt, wird als Start- oder Informationsmeldung verarbeitet. Der nachfolgende Text kann Geräte- oder Startinformationen enthalten. Abhängig von der Projektkonfiguration kann daraus eine Informationsmail erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Die Init-Meldung bestätigt, dass der UDP-Sender der Station den lokalen Server grundsätzlich erreicht. Sie bestätigt noch nicht, dass Steuerbefehle in Gegenrichtung bei der Station ankommen.&lt;br /&gt;
&lt;br /&gt;
== Zustandsmeldungen ==&lt;br /&gt;
&lt;br /&gt;
Bei stationsgesteuerten Projekten erwartet der aktuelle Code Meldungen nach dem Muster:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;amp;lt;Schlüsselwort&amp;amp;gt;: &amp;amp;lt;Stationsnummer&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Beispiel&lt;br /&gt;
! Wirkung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;idle: 1021&amp;lt;/code&amp;gt; || Die Station wird als frei markiert.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;touchscreen: 1021&amp;lt;/code&amp;gt; || Die Station wird als lokal über den Touchscreen benutzt markiert.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;open: 1021&amp;lt;/code&amp;gt; || Die Station wird unabhängig von der üblichen Belegungsprüfung als offen markiert.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Zustand `REMOTE` wird von der Anwendung bei erfolgreicher Übernahme durch einen entfernten Benutzer gesetzt. Er ist in der aktuellen Empfangslogik keine gleichartige UDP-Rückmeldung der Station.&lt;br /&gt;
&lt;br /&gt;
== Lebenszyklus einer stationsgesteuerten Nutzung ==&lt;br /&gt;
&lt;br /&gt;
# Die Station meldet `idle` und ist damit verfügbar.&lt;br /&gt;
# Ein entfernter Benutzer fordert die Station an.&lt;br /&gt;
# `megbes-internal` prüft den Zustand und ordnet die Station bei erfolgreicher Übernahme dem Benutzer zu.&lt;br /&gt;
# Steuerbefehle dieses Benutzers aktualisieren den letzten Nutzungszeitpunkt.&lt;br /&gt;
# Nach Ende der lokalen Wiedergabe meldet die Station wieder `idle`.&lt;br /&gt;
# Bleibt eine Rückmeldung aus, greift nach dem projektspezifisch konfigurierten Zeitraum die Fallback-Logik gegen dauerhaft blockierte Stationen.&lt;br /&gt;
&lt;br /&gt;
== Funktionsprüfung ==&lt;br /&gt;
&lt;br /&gt;
# Die Station beziehungsweise den UDP-Sender starten.&lt;br /&gt;
# Im Log von `megbes-internal` prüfen, ob die Init-Meldung empfangen wird.&lt;br /&gt;
# Eine Zustandsmeldung mit der korrekten Stationsnummer auslösen.&lt;br /&gt;
# Den Stationsstatus über den vorgesehenen Bedienweg abfragen.&lt;br /&gt;
# Eine Fernübernahme testen und anschließend sicherstellen, dass die Station wieder `idle` meldet.&lt;br /&gt;
&lt;br /&gt;
== Typische Fehler ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Fehlerbild&lt;br /&gt;
! Prüfung&lt;br /&gt;
|-&lt;br /&gt;
| Keine Init-Meldung im Log || Ziel-IP, UDP-Port, lokale Firewall und Netzwerkverbindung prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Meldung kommt an, Status ändert sich nicht || Schlüsselwort, Doppelpunkt, Leerzeichen und Stationsnummer mit dem erwarteten Format vergleichen.&lt;br /&gt;
|-&lt;br /&gt;
| Falsche Station ändert ihren Zustand || Stationsnummer in Stationssoftware und Projektkonfiguration prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Station bleibt belegt || Prüfen, ob nach Wiedergabeende tatsächlich `idle` gesendet wird; danach den projektspezifischen Timer prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Lokale Nutzung wird nicht erkannt || Prüfen, ob beim Start der lokalen Touchscreen-Nutzung `touchscreen` gesendet wird.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sicherheit und Dokumentation ==&lt;br /&gt;
&lt;br /&gt;
Empfängeradressen, Ports und Stationsnummern sind projektspezifisch und werden auf der Projektseite dokumentiert. Geheimwerte gehören nicht in Beispielskripte oder Wiki-Seiten. Änderungen am Nachrichtenformat müssen mit der eingesetzten Stationssoftware und dem installierten MegBes-Release abgestimmt werden.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[UDP und Stationszustände]] und [[Routing und Signalweg]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Schnittstellen]]&lt;br /&gt;
[[Kategorie:Fehlerdiagnose]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
	<entry>
		<id>https://wiki.megbes.de/index.php?title=Routing_und_Signalweg&amp;diff=63</id>
		<title>Routing und Signalweg</title>
		<link rel="alternate" type="text/html" href="https://wiki.megbes.de/index.php?title=Routing_und_Signalweg&amp;diff=63"/>
		<updated>2026-08-06T19:43:44Z</updated>

		<summary type="html">&lt;p&gt;Clawtronics: Tabellenzeilen korrekt trennen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Routing und Signalweg =&lt;br /&gt;
&lt;br /&gt;
== Zweck ==&lt;br /&gt;
&lt;br /&gt;
Diese Seite beschreibt den Weg eines Steuerbefehls vom Bediengerät bis zur Medienstation. Sie dient zugleich als Reihenfolge für die Fehlersuche: Jede Stufe muss erreichbar sein und den Befehl korrekt an die nächste Stufe übergeben.&lt;br /&gt;
&lt;br /&gt;
== Signalweg ==&lt;br /&gt;
&lt;br /&gt;
 Web-Frontend oder App&lt;br /&gt;
          ↓ HTTPS&lt;br /&gt;
 megbes-external im projektspezifischen Container&lt;br /&gt;
          ↓ HTTP oder HTTPS über die konfigurierte Adresse&lt;br /&gt;
 Router beziehungsweise FRITZ!Box am Ausstellungsort&lt;br /&gt;
          ↓ Portweiterleitung&lt;br /&gt;
 megbes-internal auf dem lokalen Server&lt;br /&gt;
          ↓ UDP im lokalen Ausstellungsnetz&lt;br /&gt;
 Medienstation oder UDP-zu-GPIO-Umsetzer&lt;br /&gt;
&lt;br /&gt;
=== 1. Web-Frontend oder App ===&lt;br /&gt;
&lt;br /&gt;
Die Bedienoberfläche erzeugt eine Anforderung mit Stationsnummer und einem oder mehreren projektspezifischen Befehlen. Je nach Projekt ist vorher eine Anmeldung, Ticketprüfung oder direkte Berechtigung erforderlich.&lt;br /&gt;
&lt;br /&gt;
=== 2. megbes-external ===&lt;br /&gt;
&lt;br /&gt;
`megbes-external` prüft die projektbezogene Authentifizierung und leitet zulässige Anforderungen an den in der Konfiguration hinterlegten internen Server weiter. Pro Kunde beziehungsweise Projekt läuft ein eigener Container. Die konkrete Domain, Containerbezeichnung und Konfiguration gehören auf die jeweilige Projektseite.&lt;br /&gt;
&lt;br /&gt;
=== 3. Öffentlicher Übergang zum Ausstellungsnetz ===&lt;br /&gt;
&lt;br /&gt;
Die Zieladresse des internen Servers wird projektspezifisch konfiguriert. Bei wechselnder öffentlicher IP-Adresse kann eine DynDNS-Adresse verwendet werden. Der Router muss den vorgesehenen externen Port an die feste lokale Adresse und den Dienst-Port von `megbes-internal` weiterleiten.&lt;br /&gt;
&lt;br /&gt;
=== 4. megbes-internal ===&lt;br /&gt;
&lt;br /&gt;
`megbes-internal` nimmt die weitergeleitete Anforderung entgegen. Je nach Projekt wird die Verbindung mit Headern oder einem Client-Zertifikat abgesichert. Anschließend zerlegt die Anwendung die Kombinationen aus Stationsnummer und Befehl und übergibt sie an den UDP-Sender.&lt;br /&gt;
&lt;br /&gt;
=== 5. UDP im Ausstellungsnetz ===&lt;br /&gt;
&lt;br /&gt;
Aus der Stationsnummer wird mit dem projektspezifischen lokalen Subnetz die Zieladresse gebildet. Der Befehl wird als UDP-Nutzlast an den konfigurierten Port der Station gesendet. Subnetz und UDP-Port dürfen nicht ungeprüft von einem anderen Projekt übernommen werden.&lt;br /&gt;
&lt;br /&gt;
=== 6. Medienstation ===&lt;br /&gt;
&lt;br /&gt;
Die Medienstation verarbeitet den vereinbarten Befehl. Mögliche Empfänger sind BrightSign-Player, PCs, Raspberry Pis oder andere UDP-fähige Geräte. Bei stationsgesteuerten Projekten sendet die Station zusätzlich Zustandsmeldungen zurück; siehe [[Client-Feedback und Stationsmeldungen]].&lt;br /&gt;
&lt;br /&gt;
== Fehlersuche entlang des Signalwegs ==&lt;br /&gt;
&lt;br /&gt;
# Prüfen, ob das Web-Frontend geladen wird und die Anforderung tatsächlich absendet.&lt;br /&gt;
# Im Log von `megbes-external` prüfen, ob die Anforderung angenommen oder wegen Authentifizierung beziehungsweise Stationsbelegung abgelehnt wurde.&lt;br /&gt;
# Prüfen, ob die konfigurierte Adresse des internen Servers aufgelöst wird und von außen erreichbar ist.&lt;br /&gt;
# DynDNS-Eintrag, öffentliche IP-Adresse und Portweiterleitung am Router vergleichen.&lt;br /&gt;
# Im Log von `megbes-internal` prüfen, ob der Aufruf ankommt und ein UDP-Signal erzeugt wird.&lt;br /&gt;
# Lokale IP-Adresse, Subnetz, Zielstation und UDP-Port prüfen.&lt;br /&gt;
# Auf der Medienstation kontrollieren, ob der UDP-Empfänger läuft und der konkrete Befehl unterstützt wird.&lt;br /&gt;
&lt;br /&gt;
== Typische Fehlerbilder ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Beobachtung&lt;br /&gt;
! Wahrscheinlicher Bereich&lt;br /&gt;
! Nächster sicherer Prüfschritt&lt;br /&gt;
|-&lt;br /&gt;
| Web-Frontend ist nicht erreichbar || Domain, Container oder `megbes-external` || Containerstatus und externes Anwendungslog prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Anmeldung funktioniert, Steuerung jedoch nicht || Verbindung zwischen externer und interner Ebene || Zieladresse, DNS-Auflösung und Log von `megbes-external` prüfen.&lt;br /&gt;
|-&lt;br /&gt;
| Interner Server ist von außen nicht erreichbar || DynDNS, Router oder Portweiterleitung || Öffentliche IP-Adresse und Routerregel abgleichen.&lt;br /&gt;
|-&lt;br /&gt;
| Aufruf erreicht `megbes-internal`, Station reagiert nicht || lokales Netz, UDP-Ziel oder Stationssoftware || Stations-IP und UDP-Port prüfen; anschließend Empfang auf der Station testen.&lt;br /&gt;
|-&lt;br /&gt;
| Einzelne Befehle funktionieren nicht || projektspezifisches Befehlsformat || Befehl mit der Projektkonfiguration und der Stationssoftware vergleichen.&lt;br /&gt;
|-&lt;br /&gt;
| Station bleibt als belegt angezeigt || fehlende oder falsche Zustandsmeldung || Rückkanal nach [[Client-Feedback und Stationsmeldungen]] prüfen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Dokumentation je Projekt ==&lt;br /&gt;
&lt;br /&gt;
Auf der Projektseite sind mindestens die verwendete externe Domain, die Art der Erreichbarkeit des internen Servers, die Portzuordnung, das lokale Subnetz, der UDP-Port, die Betriebsart und der installierte Release zu dokumentieren. Passwörter, Tokens, private Schlüssel und geheime Headerwerte gehören nicht ins Wiki.&lt;br /&gt;
&lt;br /&gt;
Siehe auch [[DynDNS und Router]].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:MegBes]]&lt;br /&gt;
[[Kategorie:Architektur]]&lt;br /&gt;
[[Kategorie:Netzwerk]]&lt;/div&gt;</summary>
		<author><name>Clawtronics</name></author>
	</entry>
</feed>