Panel-HTTP-API#
Die Browseroberfläche verwendet eine Cookie-authentifizierte API auf derselben Origin wie das Panel, standardmäßig http://127.0.0.1:20772. Es gibt keine API-Key-Anmeldung für das Panel. Diese interne Anwendungsschnittstelle kann sich zwischen Releases ändern.
Die maßgeblichen Handler stehen in Program.cs und BundleToolsEndpoints.cs. Für Integrationen die Revision in sources.json verwenden.
Anmeldung, CSRF und Ergebnisse#
GET /api/session liefert authenticated, username, permissions, csrf und setzt das CSRF-Cookie. Jeder POST, auch Login und Setup, braucht dieses Cookie und den Token im Header X-CSRF.
POST /api/login erhält username, password, remember und setzt das HttpOnly-Cookie replay-panel-session. Eine normale Sitzung endet nach vier Stunden ohne gleitende Verlängerung; „angemeldet bleiben“ verwendet ein 30-Tage-Ticket. Kontoänderungen können bestehende Sitzungen widerrufen. Logout erfolgt über POST /api/logout.
Viele Änderungen liefern Reply mit ok, optional error, status, lines; manche Datenrouten liefern direkt ausgepackte JSON-Daten. GET /api/status enthält einen Reply mit status. Nicht für alle GETs dieselbe Form voraussetzen.
| HTTP | Bedeutung |
|---|---|
| 200 | Anfrage erfolgreich; ok und gegebenenfalls Jobstatus prüfen |
| 400 | Host, CSRF oder Eingabe ungültig |
| 401 | Anmeldung fehlgeschlagen oder Sitzung fehlt/abgelaufen |
| 403 | Berechtigung fehlt |
| 404 | Ressource fehlt |
| 409 | Konflikt, deaktiviertes Feature oder Update läuft |
| 429 | Ratenlimit |
Fehler verwenden Lokalisierungsschlüssel wie csrf.invalid oder bundleTools.disabled. Remote-Zugriff benötigt die HTTPS-/Proxy-Konfiguration.
Browserbeispiel#
Dieser Code gehört in eine Integration auf derselben Panel-Origin. Zugangsdaten gibt der Benutzer über deren Login-Oberfläche ein. Die englischen Codebezeichner bleiben identisch:
async function session() {
const response = await fetch('/api/session', { credentials: 'same-origin' });
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
}
async function post(path, body) {
const { csrf } = await session();
const response = await fetch(path, {
method: 'POST', credentials: 'same-origin',
headers: { 'Content-Type': 'application/json', 'X-CSRF': csrf },
body: JSON.stringify(body)
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
return response.json();
}
// After the user logs in:
const state = await (await fetch('/api/status')).json();
console.log(state.status);
// With console.write permission, a read-only game console command:
// await post('/api/command', { text: 'bundles' });
Kernrouten#
| Methode und Pfad | Eingabe / Ausgabe | Berechtigung |
|---|---|---|
GET /api/session |
Sitzungsstatus und CSRF-Token | Öffentlich |
GET /api/bootstrap |
Einrichtungsdaten | Öffentlich |
POST /api/login |
{username,password,remember} |
Öffentlich, ratenbegrenzt |
POST /api/logout |
Leeres JSON | Angemeldet |
GET /api/status |
Reply mit Serverstatus, Prozess-ID und Serverordner | Angemeldet |
POST /api/server/{action} |
start, stop, restart, force-stop |
Passendes server.<action> |
POST /api/command |
{text} Konsolenbefehl |
console.write |
GET /api/bundles |
Bundle-Liste | bundles.read |
POST /api/bundles/{name}/{action} |
start, stop, restart |
bundles.read und passendes bundles.<action> |
GET /api/logs |
Aktuelle Konsolen-/Logausgabe | logs.read |
GET /api/log-files |
{name,size,modified,started} Liste |
logs.read |
GET /api/log-files-current |
Aktuelle Logdatei herunterladen | logs.read |
GET /api/log-files/{name} |
Letzte 2 MiB einer Logdatei | logs.read |
GET /api/log-files.zip |
ZIP-Download | logs.read |
GET /api/diagnostics |
Abfrageparameter cursor, source, module, search, limit, history |
console.read und/oder logs.read abhängig von der Quelle |
GET /api/events |
Server-Sent Events: Status, Konsole und Rechte | Angemeldet; Konsole erfordert console.read |
GET /api/bridge |
LAN-Bridge-Status | Angemeldet |
POST /api/bridge/settings |
{enabled,port,retentionDays,maxMegabytes} |
settings.write |
POST /api/settings |
{shutdownMode,autoStartServer,locale,autoUpdateChecks,updateChannel} |
Angemeldet; alle Felder außer locale erfordern settings.write |
GET /api/server-name |
{name} |
Angemeldet |
GET /api/server-config |
Bearbeitbare Serverkonfiguration | settings.write |
POST /api/server-config |
Serverkonfigurationsdokument | settings.write |
POST /api/server-path |
{serverRoot}; Server muss gestoppt sein |
settings.write |
GET /api/users |
Kontoübersicht | users.manage |
POST /api/users/save |
{username,password,permissions,enabled,create} |
users.manage |
POST /api/users/delete |
{username} |
users.manage |
Weitere Rechte erklärt Benutzer und Berechtigungen. Vor schreibenden Integrationen den tatsächlichen Handler prüfen; neben HTTP-Rechten gelten Pfad-, Zustands- und Inhaltsprüfungen.
Updates und Jobs#
Panel: GET /api/updates, POST /api/updates/{check,download,cancel,apply}. Spielserver: GET /api/server-updates, POST /api/server-updates/{check,download,apply,cancel}, optional mit target. Erforderlich ist settings.write, für Download/Anwenden zusätzlich users.manage. Annahme eines Jobs ist noch kein Abschluss. Während eines Panel-Updates werden angemeldete POSTs mit 409 update.busy abgelehnt.
Experimentelle Bundle-Tools#
Hauptschalter und Einzelrechte sind erforderlich. Builds führen vertrauenswürdigen Projektcode auf dem Host aus; vorher die Bundle-Tools-Anleitung lesen.
| Präfix / Route | Aktionen und Anfragehinweise | Berechtigung |
|---|---|---|
GET /api/bundle-tools |
Status, bereinigte Konten und erlaubte Jobs | Passendes Bundle-Recht |
POST /api/bundle-tools/settings |
Bundle-Tool-Einstellungen | bundles.settings |
POST /api/bundle-tools/upload |
Multipart-ZIP; X-CSRF erforderlich, keinen JSON-Content-Type setzen |
bundles.upload |
POST /api/bundle-tools/upload/exists |
{name} |
bundles.upload |
POST /api/bundle-tools/upload/install |
Geprüftes Upload-/Installationsdokument | bundles.upload |
/api/bundle-tools/tools |
POST install, remove; GET latest |
bundles.tools |
GET /api/bundle-tools/projects |
Quellprojekte | bundles.build |
POST /api/bundle-tools/projects/{action} |
create, import, pull, checkout, check, refs, build, rollback, remove |
bundles.build; Entfernen zusätzlich bundles.sources.delete; Remote-Zugriffe brauchen Kontonutzungsrechte |
POST /api/bundle-tools/accounts/{action} |
save Einstellungen/Token; delete oder test mit {name} |
bundles.accounts.manage |
POST /api/bundle-tools/remote/{action} |
owners, repositories |
bundles.accounts.use, ratenbegrenzt |
POST /api/bundle-tools/projects/workflow |
Review-/Direkt-Workflow konfigurieren | bundles.settings |
POST /api/bundle-tools/projects/compare |
Repository-Vergleich | bundles.build, bundles.accounts.use |
POST /api/bundle-tools/projects/{merge,review} |
Review-/Merge-Dokument | Build, Git-Schreiben, Kontonutzung und passendes Merge-/Review-Recht |
POST /api/bundle-tools/packages/info |
Paketmetadaten abfragen | bundles.build |
POST /api/bundle-tools/packages/review |
Paketänderung als Review | Build, Git-Schreiben, Konten, Pakete, Review |
GET /api/bundle-tools/jobs/{id} |
Job und Ergebnis | Recht für die Jobart |
GET /api/bundles/metadata |
Kategorien und Autostart | bundles.read |
POST /api/bundles/{tags,autostart} |
Metadatenänderung | bundles.read plus passendes Recht |
POST /api/bundles/delete-info |
{name} Löschvorschau |
bundles.read, bundles.delete |
POST /api/bundles/delete |
Bestätigtes Löschdokument | Lesen/Löschen/Stoppen plus ausgewählte Daten-/Quellenrechte |
projects/delivery und packages/set liefern derzeit 409 bundleTools.workflow; den konfigurierten Review-Workflow verwenden. Detaillierte Request-Typen stehen in Supervisor-Handlern und Panel-UI der dokumentierten Revision. Account-Tokens werden nie an den Browser ausgegeben.
Ersteinrichtung#
Setup benötigt den lokalen Setup-Key und ist ratenbegrenzt. POST-Routen: /api/setup/validate, /install, /finish, /pick, /pick-status, /job, /cancel. Das Setup-Dokument enthält key, dashboardName, username, password, confirmation, locale, serverRoot, backend; Status-/Cancel-Aufrufe verwenden key. Der Ordnerdialog ist nur bei direktem Loopback-Zugriff verfügbar. GET /api/setup/console ersetzt den Key nicht. Reihenfolge und Validierung über die Einrichtungsanleitung nachvollziehen.