Zum Inhalt

SKYMP WORLDS · Handbuch für Serverbetreiber

Deinen Server anbinden. Deine Welt bewahren.

Die technische Anleitung für eigene SkyMP-Server: Registrierung, Dateien, Clientpakete, Anmeldung und Betrieb mit dem gemeinsamen Launcher.

Launcher 0.2.0 · Stand 22.10.2026

01Bestehenden Server integrierenSchnittstellen und Voraussetzungen prüfen, gezielt ergänzen und die eigene Installation testen.02SkyMP-Fork verwendenDen verlinkten Quellstand als Ausgangspunkt verwenden und seine Launcher-Schnittstellen prüfen.
01

Geltungsbereich & Kompatibilität

#

Diese Anleitung beschreibt den gemeinsamen SkyMP-Worlds-Launcher 0.2.0 und die am 22.10.2026 geprüften Schnittstellen. Du kannst einen bestehenden kompatiblen SkyMP-Server erweitern oder den RealHartlMax/SkyMP-Fork als Grundlage verwenden. Die Spielerdaten und die Spielwelt werden durch eine Registrierung im Launcher nicht automatisch migriert.

Es gibt keine Kompatibilitätsgarantie. Ein Servereintrag, ein erfolgreich geladenes Manifest oder ein erfolgreicher Build beweist noch keine funktionierende Spielsitzung. Spielprotokoll, Server, nativer Client, Skyrim-Version, SKSE, Address Library, Mods und Ladereihenfolge müssen zusammenpassen. Ein anderer Multiplayer-Mod wird durch zusätzliche HTTP-Routen nicht automatisch SkyMP-kompatibel.

Prüfe Änderungen zunächst auf einer getrennten Testinstallation. Sichere Serverkonfiguration, Weltdaten, Konten und Schlüssel vor einer Umstellung. Die Beispiele enthalten absichtlich erkennbare Platzhalter; Dateigrößen, CRC32 und SHA-256 müssen aus deinen tatsächlichen Dateien erzeugt werden.

↑ Nach oben
02

Welche Dienste zusammenarbeiten

#
BausteinAdresse / ProtokollAufgabe
Zentrale Listehttps://api.skymp-worlds.net/list.phpServer entdecken; im Launcher fest vorgegeben
Betreiberkontohttps://manage.skymp-worlds.net/Server registrieren, Metadaten und private Schlüssel verwalten
Online-Masterhttps://api.skymp-worlds.netAnmeldung, Heartbeats und Spielsitzungen
Dein SpielserverÖffentlicher Host und UDP-Port, beispielsweise 7777Eigentliche Spielverbindung
Dein DateiserverÖffentliche HTTP(S)-Basis, beispielsweise https://files.example.org/Modmanifest und Downloads
ClientkatalogVollständige URL zu catalog.jsonPassende native Client-/SKSE-Kombination auswählen

Spieladresse, Dateiserver und Master sind unterschiedliche Ziele. resourceUrl ist die Basis des Dateiservers, nicht die URL seiner Manifestroute. runtimeSource ist dagegen eine vollständige Katalog- oder Clientmanifest-URL. Der Launcher bereitet Dateien vor und startet anschließend den SKSE-Loader aus dem ausgewählten Spielverzeichnis.

↑ Nach oben
03

Weg A: Den verlinkten Fork verwenden

#
  1. Verwende den RealHartlMax-Fork. Prüfe den gewählten Commit oder das konkrete Release; ein beliebiges Upstream-Paket enthält nicht zwangsläufig dieselben Launcher-Erweiterungen.
  2. Für einen eigenen Build folge dem CMake-Ablauf des Forks und CONTRIBUTING.md. Ersetze eine laufende Installation erst nach Sicherung und Test.
  3. Der gebaute Server liegt üblicherweise unter build/dist/server, der Windows-Client unter build/dist/client. Fertige Serverpakete werden mit launch_server.bat beziehungsweise launch_server.sh gestartet. Die benötigte Laufzeit und Erstkonfiguration beschreibt die Serveranleitung im Fork.
  4. Stelle die eigenen Skyrim-/DLC-Masterdateien im konfigurierten dataDir bereit. Serverpakete ersetzen keine eigene Skyrim-Installation. Übernimm deine bestehende, passende Ladereihenfolge.
  5. Registriere den Server, ergänze die Verbindungskonfiguration, veröffentliche Mods und ein passendes Clientpaket und führe die Prüfschritte aus.

Ein neuer Checkout lässt sich getrennt anlegen:

sh
git clone https://github.com/RealHartlMax/skymp.git skymp-server-source
cd skymp-server-source

Das Klonen ist noch kein Build und kein Serverstart. Für die Launcher-Erweiterung sind insbesondere skymp5-server/ts/launcherResources.ts, deren Registrierung in ui.ts sowie die Master-/Login-Systeme relevant. Die veröffentlichten Modrouten wurden mit dem lokalen Stand verglichen; das ersetzt keine Prüfung deiner eigenen Binärdateien. Lokale, noch nicht veröffentlichte Clientanpassungen sind durch einen Repository-Link nicht automatisch verfügbar.

↑ Nach oben
04

Weg B: Einen bestehenden Server integrieren

#

Erweitere deinen bisherigen Server gezielt. Der gemeinsame Launcher verändert weder deine Gamemode-Logik noch dein Datenbankformat. Eine abweichende Implementierung kann zusätzliche Anpassungen benötigen.

AnforderungWas du bereitstellen oder prüfen musst
SpielprotokollEin zum verwendeten nativen SkyMP-Client kompatibler UDP-Server
VerbindungsdatenÖffentlicher Spielhost, Spielport, Datei-Basis-URL, Anmeldemodus und Clientquelle
ModbereitstellungBevorzugt Manifest v2 und verifizierbare Downloads; alternativ der begrenzte Legacy-Vertrag
Online-AnmeldungMaster-Heartbeat und serverseitige Sitzungsvalidierung gemäß Anmeldevertrag
ClientlaufzeitVollständige, zu Spiel und Server passende Clientdateien; für automatische Versionswahl ein Katalog
NachweisAPI-, Download-, Wiederherstellungs- und anschließend echte Spieltests

Die neue Modbereitstellung ist im Fork ein eigener Ressourcenbaustein mit expliziter Konfiguration. Nur die Datei zu kopieren genügt nicht: Der HTTP-Router muss sie registrieren, die tatsächlichen Quellverzeichnisse und die Ladereihenfolge übergeben und Fehler korrekt beantworten. Bei einem anderen Server-Stack kannst du denselben Vertrag implementieren. Die JSON-Feldnamen und Downloadregeln bleiben dabei verbindlich.

Ein bereits laufender Server kann für erste Tests weiterhin per Direktverbindung geöffnet werden. Für die öffentliche Namenssuche ist zusätzlich die Registrierung mit einem gültigen Heartbeat erforderlich. Eine öffentliche Registrierung bestätigt keine technische Kompatibilität.

↑ Nach oben
05

Konto, Servereintrag & öffentliche Identität

#
  1. Erstelle ein reguläres Konto im Betreiber-Dashboard und bestätige gegebenenfalls die E-Mail-Adresse. Demo-Zugänge werden nicht für Spielanmeldungen verwendet.
  2. Lege deinen Server mit öffentlichem Host, UDP-Spielport und Spielerlimit an. Wähle den Status active, wenn er öffentlich verfügbar sein soll.
  3. Öffne beim Eintrag Launcher & Online-Anmeldung. Trage die öffentliche Dateiserver-Basis und die vollständige Clientkatalog-URL ein. Beschreibung, Tags, Land, Spielmodus, Banner, Logo und eigene Community-Links sind öffentliche Profildaten.
  4. Übernimm die angezeigte öffentliche Server-ID und den privaten API-Schlüssel in die Serverkonfiguration. Starte den Server danach geordnet neu.
  5. Nach einem akzeptierten Heartbeat erscheint er in der zentralen Liste. Ein leerer Abruf [] ist ohne aktive Einträge normal. Der PHP-Master blendet Einträge ohne gültigen Heartbeat nach etwa fünf Minuten aus.
WertSichtbarkeitVerwendung
serverUidÖffentlichStabile ID für Auswahl und Spielsession
masterKey in server-settings.jsonPrivatAuthentifiziert deinen Server beim Master
masterKey im öffentlichen ListeneintragÖffentlichHistorischer Feldname; beim aktuellen PHP-Master steht hier die öffentliche Server-ID
Login-Token / SpielsessionPrivatZeitlich begrenzte Benutzer- bzw. Serveranmeldung

Veröffentliche niemals den privaten Heartbeat-Schlüssel als Beschreibung, Tag oder Download. Er gehört nicht in das Launcher-Profil des Spielers. Eine Schlüsselrotation erfolgt über das Dashboard; aktualisiere danach die private Serverkonfiguration und starte den Server neu.

↑ Nach oben
06

Vorhandene Serverkonfiguration ergänzen

#

Das folgende JSON ist ein Zusammenführungsbeispiel, keine vollständige Ersatzkonfiguration. Behalte Gamemode, Datenpfade, Weltdaten, weitere Einstellungen und die vollständige korrekte Ladereihenfolge deines Servers bei. Ersetze öffentliche ID und privaten Schlüssel durch die Werte deines eigenen Eintrags.

json
{
  "port": 7777,
  "uiPort": 8080,
  "listenHost": "0.0.0.0",
  "uiListenHost": "0.0.0.0",
  "master": "https://api.skymp-worlds.net",
  "serverUid": "srv_REPLACE_WITH_PUBLIC_ID",
  "masterKey": "REPLACE_WITH_PRIVATE_SERVER_KEY",
  "offlineMode": false,
  "launcherResources": {
    "enabled": true,
    "directory": "./client-resources",
    "runtimeSource": "https://update.skymp-worlds.net/client-runtime/catalog.json"
  }
}

launcherResources.directory wird im Fork relativ zum Arbeitsverzeichnis des Serverprozesses aufgelöst. Starte ihn deshalb aus seinem vorgesehenen Paketverzeichnis oder verwende einen bewusst gewählten absoluten Pfad. Ohne explizite Angabe sind die Modbereitstellung aktiviert und ./client-resources vorgesehen. Mit enabled: false wird die neue Mod-API deaktiviert.

Der Katalog unter der Update-Domain muss tatsächlich hochgeladen und für deine Client-/Serverkombination geeignet sein. Die URL ist keine allgemeine Zusage für jede Skyrim-Version. Du kannst stattdessen eine eigene vollständige catalog.json anbieten. Halte die Angaben im Servermanifest und im Dashboard konsistent; nach einer Änderung der Downloadangaben wird ein neuer Heartbeat benötigt.

↑ Nach oben
07

Erreichbarkeit, TLS & Reverse Proxy

#
VerbindungTypische FreigabePrüfen
Spielclient → Spielserver7777/UDP oder dein SpielportFirewall, NAT und öffentliche Spieladresse
Launcher → Dateiserver443/TCP mit HTTPS oder direkter HTTP-PortManifest und Dateien anonym erreichbar
Spielserver → MasterAusgehend 443/TCPDNS, TLS-Zertifikat und Heartbeats
Spieler → Dashboard/MasterHTTPSAnmeldung, Zustimmung und Session-Erstellung

PHP-Webspace kann Dashboard, Master-Gateway, Dokumentation und statische Downloads ausliefern. Er ersetzt keinen dauerhaft laufenden nativen Spielserver. Ein gewöhnlicher HTTP-Reverse-Proxy transportiert den UDP-Spielport nicht automatisch.

Nutze bei einem Proxy die endgültige öffentliche Basis-URL, beispielsweise https://files.example.org/realm/. Unter diesem Präfix müssen api/launcher/manifest und die relativen Downloadpfade erreichbar sein. Der Launcher folgt bei Manifesten und Dateien keinen HTTP-Weiterleitungen. Trage daher die finale HTTPS-Adresse mit passendem Hostnamen ein; vorgeschaltete Login-Seiten, Basic Auth und Weiterleitungen sind keine öffentlichen Downloads.

Die Download-/Katalog-URLs dürfen keine Zugangsdaten, Query-Parameter oder Fragmente enthalten. Der öffentliche PHP-Master lehnt private, Loopback- und Link-Local-Ziele ab, auch bei DNS-Auflösung. 127.0.0.1 bedeutet aus Sicht eines Spielers dessen eigenen Rechner. Für lokale Entwicklung verwende eine direkte lokale Verbindung; veröffentliche keine internen Adressen im Produktivprofil. Die Launcher-Dateizugriffe laufen im Rust-Backend und benötigen keine Browser-CORS-Freigabe.

↑ Nach oben
08

Mods, Assets & Ladereihenfolge bereitstellen

#
text
server-settings.json
data/
  Skyrim.esm
  World.esp
  World.bsa
client-resources/
  Data/
    World - Textures.bsa
    Scripts/WorldClient.pex
    meshes/World/sword.nif
    textures/World/sword.dds
    SKSE/Plugins/World.ini

Im Fork werden eigene Plugins aus loadOrder und zugehörige Archive NAME.bsa bzw. NAME - *.bsa aus dataDir automatisch berücksichtigt. Weitere Dateien für den Spielclient legst du mit ihrer endgültigen Verzeichnisstruktur unter client-resources/Data/ ab. Serverseitige Skripte unter data/scripts/ werden dadurch nicht automatisch als Clientskripte verteilt.

Alle zusätzlichen .esm, .esp und .esl müssen in der tatsächlichen Server-Ladereihenfolge stehen. Liegt ein Plugin sowohl im Daten- als auch im Ressourcenverzeichnis, müssen beide Kopien übereinstimmen. Plugins und BSA-Archive liegen direkt unter Data/; Texturen, Modelle und Skripte behalten ihre Unterordner. Nach Änderungen an der Ladereihenfolge den Server neu starten. Der Ressourcenindex verwendet einen kurzen Metadatencache von ungefähr zwei Sekunden.

kindZulässige Inhalte im Modpaket
mod.esm, .esp, .esl
archive.bsa
scriptKompilierte .pex unter Data/Scripts/
assetUnterstützte Modelle, Texturen, Animationen, Audio, Interface, Sprach- und Bilddateien
configPassive .ini, .json, .xml, .txt, .toml, .yaml, .yml

Native DLLs und JavaScript gehören in das getrennte Clientpaket. Geschützte Plattform-/Anmeldedateien, Bethesda-Master und Creation-Club-Dateien werden nicht als Moddownload angeboten. Pfadwechsel, Symlinks/Junctions, Windows-Gerätenamen, Doppelpunkte, nachgestellte Punkte/Leerzeichen und nur in der Großschreibung unterschiedliche Zielpfade werden abgewiesen. Für die neue Mod-API gilt eine Zielpfadlänge von höchstens 240 UTF-8-Bytes.

ZIP-/7z-/FOMOD-Pakete werden nicht beim Spieler entpackt oder interaktiv installiert. Bereite die gewünschte Modauswahl selbst vor und veröffentliche nur die benötigten, zur Weitergabe vorgesehenen Dateien. Eigene Skyrim-/DLC-Dateien müssen aus der passenden Installation des Spielers stammen.

↑ Nach oben
09

Manifest v2: Vertrag für eigene Implementierungen

#

GET <resourceUrl>/api/launcher/manifest liefert ohne Betreiber-Login JSON mit version als Zeichenkette "2". Zahlen und Prüfsummen im folgenden Strukturbeispiel sind Beispielwerte, keine Werte einer tatsächlich spielbaren Modfreigabe. Dein Server muss sie aus den echten Dateien berechnen.

json
{
  "version": "2",
  "revision": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  "generatedAt": "2026-10-21T12:00:00.000Z",
  "totalSize": 12345,
  "loadOrder": ["Skyrim.esm", "World.esp"],
  "requiredLocalFiles": [
    { "filename": "Skyrim.esm", "size": 249753412, "crc32": 123456789 }
  ],
  "runtimeSource": "https://update.skymp-worlds.net/client-runtime/catalog.json",
  "resources": [
    {
      "name": "World.esp",
      "path": "Data/World.esp",
      "kind": "mod",
      "size": 12345,
      "hash": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
      "downloadPath": "api/launcher/files/1111111111111111111111111111111111111111111111111111111111111111"
    }
  ]
}
FeldBedeutung
loadOrderNicht leere, geordnete Pluginliste; keine Namen aus Verzeichnissen ableiten
requiredLocalFilesLokale Bethesda-/Creation-Club-Anforderungen mit Dateiname, Bytezahl und CRC32; keine Download-URLs
resources[].pathEindeutiger Zielpfad relativ zum Spielverzeichnis, beginnend mit Data/
nameDateiname zur Anzeige; darf in verschiedenen Assetordnern gleich sein
sizeExakte Bytezahl als JSON-Zahl
hashsha256: gefolgt von 64 Hex-Zeichen des tatsächlichen Inhalts
downloadPathRelativer Pfad api/launcher/files/ mit einer 64-stelligen hexadezimalen, undurchsichtigen ID
totalSizeSumme der Modressourcen; das getrennte Clientpaket zählt nicht dazu
revision, generatedAtVeröffentlichung identifizieren bzw. zeitlich einordnen
runtimeSourceOptionaler vollständiger Clientkatalog-/Manifest-Link

Ein Generator muss die freigegebenen Quellwurzeln prüfen, Links ausschließen, Zielpfade nach Windows-Regeln normalisieren, Duplikate erkennen und Größe/SHA-256 aus den gelesenen Inhalten ermitteln. CRC32 gilt für lokale Spielanforderungen; es ersetzt nicht SHA-256 bei Downloads. Liefere keine widersprüchlichen Metadaten, wenn während einer Veröffentlichung Dateien fehlen oder wechseln. Für ungeeignete Veröffentlichungen ist ein Fehler besser als eine unvollständige erfolgreiche Liste.

Grenzen des aktuellen Vertrags: höchstens 10.000 Moddateien, 8 GiB je Datei, 64 GiB je Modpaket; JSON-Manifeste werden im Launcher auf 8 MiB begrenzt. Gleiche Grenzwerte und geschützte Zielpfade gehören in eine eigene Implementierung.

↑ Nach oben
10

Download-Endpunkte & HTTP-Antworten

#

GET bzw. HEAD <resourceUrl>/api/launcher/files/<id> muss die im Manifest angekündigte Datei liefern. Eine Ressourcen-ID bezeichnet eine freigegebene Datei; sie darf nicht als beliebiger Dateisystempfad ausgewertet werden. Ein separater Dateihost ist möglich, wenn das Manifest und alle relativen Routen unter seiner Basis erreichbar bleiben.

AntwortVerhalten des Forks / Bedeutung
200Vollständige Datei, korrekte Content-Length; HEAD ohne Antwortkörper
206Unterstützter einzelner Byte-Bereich mit Content-Range
304If-None-Match passt zum ETag
400Ungültige Ressourcen-ID
404API deaktiviert oder ID der alten Revision nicht mehr vorhanden
409Datei seit dem Indexieren verändert; Manifest neu abrufen
416Ungültiger Byte-Bereich
503Veröffentlichung unvollständig, nicht lesbar oder widersprüchlich

Der Fork sendet außerdem X-Resource-Hash, ETag und Accept-Ranges: bytes. Unveränderliche Datei-IDs dürfen langfristig gecacht werden; das Manifest muss aktuell bleiben. Der Launcher prüft heruntergeladene Daten unabhängig von den HTTP-Headern gegen Größe und SHA-256. Er benötigt vollständige Downloads; HTTP-Range-Unterstützung ist keine Zusage, dass ein abgebrochener Download in dieser Launcher-Version fortgesetzt wird.

↑ Nach oben
11

Ältere Server: Legacy-Vertrag

#

Nur ein HTTP 404 auf /api/launcher/manifest erlaubt dem Launcher den Rückfall auf /api/resources/manifest und /manifest.json. Ein 503, eine ungültige v2-Antwort oder eine Prüfsummenabweichung wird nicht durch stillen Legacy-Betrieb übergangen.

Der ältere Ressourcenvertrag verwendet version: "1", flache Dateinamen und Downloads über /api/resources/download/<name>. Unterverzeichnisse moderner Assetpakete werden damit nicht vollständig beschrieben. Das zusätzliche Spielmanifest liefert beispielsweise diese Struktur; auch hier sind Zahlen Platzhalterwerte:

json
{
  "versionMajor": 1,
  "mods": [
    { "filename": "Skyrim.esm", "size": 249753412, "crc32": 123456789 }
  ],
  "loadOrder": ["Skyrim.esm"]
}

Ohne Ressourcen-API funktioniert dieser Weg nur, wenn alle erforderlichen Dateien bereits lokal vorhanden sind und zu den veröffentlichten Größen/CRC32 passen. Eine alte pauschale .esm-Sperre oder ein fehlender Download für eigene Plugins wird dadurch nicht repariert. Für neue Integrationen und strukturierte Modpakete verwende v2.

↑ Nach oben
12

Client, SKSE & Address Library veröffentlichen

#

Die Launcher-EXE enthält keine SkyMP-/SKSE-DLLs. Du veröffentlichst eine passende Clientkombination außerhalb des Launchers. runtimeSource kann ein einzelnes runtime-manifest.json oder ein catalog.json mit mehreren freigegebenen Skyrim-Versionen sein. Der Katalog wählt anhand der echten Dateiversion von SkyrimSE.exe genau den passenden Eintrag; eine andere, vermeintlich neuere Spielversion wird nicht ersatzweise installiert.

Katalogbeispiel mit einer relativen Manifestadresse; der SHA-256 ist ein Beispielwert und muss durch den Hash der exakten Manifestdatei ersetzt werden:

json
{
  "version": 2,
  "packages": [
    {
      "gameVersion": "1.7.104.0",
      "manifest": "1.7.104.0/client-release/runtime-manifest.json",
      "sha256": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
    }
  ]
}

Das ausgewählte Clientmanifest verwendet die Zahl version: 1, gameVersion, skseVersion und files. Jede Datei hat path, size und einen SHA-256 ohne sha256:-Präfix. Für ein vollständiges versioniertes Paket werden mindestens diese Kernpfade verlangt; alle weiteren Laufzeit-, CEF- und Skriptdateien des fertigen Clients gehören ebenfalls hinein:

text
Data/SKSE/Plugins/SkyrimPlatform.dll
Data/SKSE/Plugins/MpClientPlugin.dll
Data/Platform/Plugins/skymp5-client.js
Data/Platform/Distribution/RuntimeDependencies/SkyrimPlatformImpl.dll
skse64_loader.exe
skse64_1_7_104.dll
Data/SKSE/Plugins/versionlib-1-7-104-0.bin

Diese sieben Namen zeigen die Kombination für Skyrim 1.7.104.0 mit SKSE 2.3.1; sie sind keine vollständige Dateiliste und keine allgemeine Garantie. Andere Spielversionen brauchen die entsprechend passenden Dateien und native Unterstützung. Das Adressdatenformat ist im geprüften 1.5-Zweig Format 1, im 1.6-Zweig Format 2 und im 1.7-Zweig Format 5. Eine neue Address Library macht eine alte, inkompatible Plugin-DLL nicht automatisch kompatibel.

Erzeuge die Dateien mit den Werkzeugen aus dem Launcher-Repository, nicht aus dem Serververzeichnis. Die folgenden PowerShell-Befehle setzen einen fertig gebauten Client, das entpackte passende SKSE-Archiv und die passende Adressdatei voraus:

powershell
node launcher/scripts/create-runtime-manifest.mjs `
  --source C:/Build/skymp/build/dist/client `
  --output C:/Publish/client-runtime/1.7.104.0/client-release `
  --game-version 1.7.104.0 `
  --skse-version 2.3.1 `
  --skse-source C:/Packages/skse64_2_03_01 `
  --address-library C:/Packages/AddressLibrary/SKSE/Plugins/versionlib-1-7-104-0.bin

node launcher/scripts/create-runtime-catalog.mjs `
  --root C:/Publish/client-runtime `
  --manifest 1.7.104.0/client-release/runtime-manifest.json

Der Ausgabeordner eines Pakets muss neu sein. Wiederhole --manifest für weitere Spielversionen; pro Version darf es genau einen aktuellen Katalogeintrag geben, insgesamt höchstens 512. Zum bewussten Ersetzen eines bestehenden Katalogs dient --replace. Erst neue Paketordner vollständig hochladen, danach den Katalog zuletzt umstellen. Der Katalog wird neu validiert; passende Dateihashes werden aus dem Cache wiederverwendet.

Das Werkzeug lässt persönliche Verbindungseinstellungen, gespeicherte Anmeldungen und Bethesda-Dateien aus und übernimmt passende SKSE-Skripte und vorhandene SKSE-Dokumente. Veröffentliche notwendige Lizenzen mit. Eine ausdrücklich manuell ausgewählte Clientquelle im erweiterten Launcher-Profil hat Vorrang; für automatische Serverangebote muss diese manuelle Auswahl entfernt werden. Eine lokale Buildquelle aktualisiert sich nicht über das Internet.

Die üblichen Zielordner liegen unter dem Spielverzeichnis: Data/Platform/Plugins für Clientskripte, Data/SKSE/Plugins für native Plugins und die Address Library sowie der Spielhauptordner für SKSE. Der Fork liest die Pluginordner aus Data/SKSE/Plugins/SkyrimPlatform.ini; der Standard lautet Data/Platform/Plugins;Data/Platform/PluginsDev. Alte Dateien unter Platform/Plugins ohne Data/ werden dadurch nicht automatisch verwendet oder vom Launcher verwaltet.

Fehlt runtimeSource sowohl im Servermanifest als auch im ausgewählten Profil, kann der Launcher nur vorhandene Clientdateien verwenden; es gibt dann kein angebotenes automatisches Clientupdate. Eine Änderung der angebotenen Clientdateien wird bei der nächsten Vorbereitung über Manifest und Dateihashes erkannt. Neu herunterladen muss er nur fehlende oder abweichende Dateien. Der private Anmeldestatus und die erzeugten Verbindungseinstellungen sind von Clientpaketen ausgeschlossen.

↑ Nach oben
13

Online-Anmeldung & Sitzungsvertrag

#

Die zentrale Plattform verwendet reguläre Dashboard-Konten, eine ausdrückliche Spielzustimmung und servergebundene Sessions. offlineMode muss auf dem Server und im Verbindungsprofil zusammenpassen. Nur im Launcher auf offline umzuschalten ändert die Serverauthentifizierung nicht.

Methode und Route am MasterZweck
GET /api/users/login-discord?state=<64-hex>Browser zur Konto-/Spielanmeldung führen
GET /api/users/login-discord/status?state=<64-hex>Nach Zustimmung Login-Token und numerische Identität erhalten; vorher 401
POST /api/users/me/play/<serverUid>Mit Login-Token eine Session für die öffentliche Server-ID anfordern
POST /api/servers/<privateMasterKey>Serverseitiger Heartbeat mit beispielsweise online, maxPlayers, optional serverUid
GET /api/servers/<privateMasterKey>/sessions/<session>Session auf dem Spielserver prüfen; gültige Antwort enthält user.id und user.name
GET /api/servers/<serverUid>/manifest.jsonÖffentliches Spielmanifest über den Master-Proxy abrufen
GET /api/servers/<serverUid>/serverinfoÖffentliche Verbindungseigenschaften abrufen

POST /api/users/me/play/... übergibt den Login-Token im Header Authorization; der PHP-Master akzeptiert auch das Präfix Bearer. Die Antwort enthält session. Beim Heartbeat und beim Nachprüfen dieser Session verwendet ausschließlich der Spielserver seinen privaten Schlüssel. Behandle entsprechende Server-Logzeilen und URL-Protokolle als vertraulich und entferne Schlüssel vor Supportanfragen.

Eine Session gilt nur für den vorgesehenen Server und dessen aktuellen privaten Schlüssel. Ablauf, Dashboard-Abmeldung und Schlüsselrotation können Sitzungen ungültig machen. Der Server muss ungültige Sessions ablehnen. Ein neuer Master darf bestehende numerische Spielidentitäten nicht ohne eine geplante Datenmigration neu vergeben.

Der historische Routenname login-discord bedeutet bei diesem PHP-Master keine automatisch eingerichtete Discord-OAuth- oder Gildenprüfung. Zusätzliche Discord-Rollen-/Gildenregeln benötigen eine passende echte Providerintegration. Der öffentliche Community-Einladungslink ist kein Anmeldeanbieter. Ein eigener kompatibler Master lässt sich für direkte Verbindungen konfigurieren; ein zentral registrierter Server nutzt die im zentralen Listeneintrag veröffentlichten Masterangaben.

↑ Nach oben
14

Installation prüfen, bevor Spieler beitreten

#

Stufe 1: Öffentliche HTTP-Schnittstellen

Die folgenden PowerShell-Beispiele verwenden curl.exe, damit nicht der ältere PowerShell-Alias gemeint ist. Unter Linux lautet der Befehl curl mit denselben Optionen. Ersetze files.example.org durch deine endgültige öffentliche Adresse.

powershell
curl.exe --fail-with-body https://api.skymp-worlds.net/health
curl.exe --fail-with-body https://api.skymp-worlds.net/list.php
curl.exe --fail-with-body https://files.example.org/api/launcher/manifest
curl.exe --fail-with-body https://update.skymp-worlds.net/client-runtime/catalog.json

Erwartet werden JSON-Antworten ohne Login-Seite oder Weiterleitung. Prüfe öffentliche ID, Datei-Basis, Anmeldemodus, Ladereihenfolge und Clientquelle. Der private Server-Schlüssel darf in der öffentlichen Liste nicht vorkommen. Lade mindestens eine tatsächliche Ressource über ihre veröffentlichte ID und vergleiche die lokale Prüfsumme mit hash:

powershell
Get-FileHash -Algorithm SHA256 ./downloaded-file.bin

Unter Linux eignet sich sha256sum ./downloaded-file.bin. Stelle zusätzlich sicher, dass unbekannte IDs, geänderte Dateien und ungültige Pfade verständliche Fehler liefern und niemals beliebige Serverdateien ausgeben.

Stufe 2: Vorbereitung ohne Spielstart

Wähle in einer getrennten geeigneten Testinstallation den Spielordner mit SkyrimSE.exe. Schließe Skyrim. Öffne den Server im Launcher, dann Verbindungsoptionen und Dateien vorbereiten. Dieser Vorgang startet kein Spiel, verändert aber die vorbereitete Testinstallation. Prüfe Unterordner, vollständige Clientdateien, Ladereihenfolge und die erzeugten Verbindungseinstellungen. Wiederhole die Vorbereitung: gültige Dateien sollen aus dem Cache kommen. Teste anschließend Originaldateien wiederherstellen und den Wechsel zwischen zwei Testprofilen.

Der Launcher führt Hash- und Versionsprüfungen vor der Aktivierung aus. Ein falscher Hash, eine fehlende Paketversion oder ein abgebrochener Download darf keine unvollständige Freigabe aktivieren. Der Launcher-Quellcode enthält zusätzlich temporäre HTTP-/Wiederherstellungstests und einen Test gegen eine getrennte Kopie des nativen Servers.

Stufe 3: Eigener vollständiger Spieltest

Erst jetzt einen echten Skyrim-/SKSE-Test mit der vorgesehenen Version durchführen: Start, Browseranmeldung und Zustimmung, Session-Prüfung, UDP-Verbindung, gemeinsame Spielwelt und erneutes Verbinden. Prüfe zusätzliche native Plugins getrennt. Ein bestandener Datei- oder API-Test ist kein Ersatz für diesen Test. Dokumentiere den tatsächlich getesteten Server-/Clientstand und das Modpaket, bevor du es für Spieler anbietest.

↑ Nach oben
15

Updates, Rücknahme & Wiederherstellung

#

Veröffentliche neue Mod- und Clientdateien als zusammenhängende Freigabe. Halte Ladereihenfolge, Serverdaten und Clientressourcen synchron. Für Clientupdates neue unveränderliche Paketpfade erzeugen, alle Dateien hochladen und den Katalog zuletzt umstellen. Eine Katalogänderung ersetzt keinen nötigen Serverneustart bei geänderten Plugins.

Die Launcher-Caches sind nach Serverziel getrennt. Originale und Aktivierungsjournal liegen unter <Skyrim>/.skymp-launcher/. Pluginlisten unter dem Skyrim-Profil und gegebenenfalls Skyrim.ccc werden für die gewählte Ladereihenfolge angepasst. Bewahre das Journal auf, solange Dateien aktiviert sind; lösche es nicht als vermeintliche Fehlerbehebung. Bei eigenen Änderungen an verwalteten Dateien kann eine Wiederherstellung zum Schutz dieser Änderungen abbrechen.

Sichere Weltdaten und Serverkonfiguration vor Updates unabhängig vom Launcher. Der Betreiber der zentralen PHP-Plattform muss Kontenspeicher und den privaten Auth-Speicher samt Identitätszuordnung und Schlüssel gemeinsam erhalten. Eine Rücknahme des Clientkatalogs stellt nur die angebotenen Clientdateien um; sie ist keine automatische Rücknahme einer Server-/Weltdatenmigration.

Bei einer gesperrten oder kompromittierten Serveridentität Schlüssel rotieren, private Konfiguration aktualisieren und den Heartbeat neu starten. Für Support reichen öffentliche ID, Zeit, Launcher-/Client-/Skyrim-Version und bereinigte Fehlermeldungen. Passwörter, private Master-Schlüssel und Sessions gehören nicht in einen Discord-Beitrag.

↑ Nach oben
16

Häufige Fehler gezielt eingrenzen

#
SymptomNächster Prüfschritt
Heartbeat meldet 404 mit Server is not registered yetAlter Registry-Pfad: API-Webroot einschließlich api/servers/index.php und native-heartbeat.php zusammen mit dem Dashboard aktualisieren; private Konfiguration und Daten erhalten
Server fehlt in der NamenssucheEintrag active, öffentliche Adresse, gültiger privater Schlüssel und aktueller Heartbeat prüfen
Neue Manifestroute liefert 404Fork-/Routerstand oder enabled prüfen; nur dann ist der begrenzte Legacy-Rückfall vorgesehen
Manifest liefert 503Serverlog, Quellordner, Links, doppelte Zielpfade und laufende Veröffentlichung prüfen
Download liefert 409 oder falschen HashVeröffentlichung beenden, neues Manifest abrufen, echte Inhalte und Größen neu indexieren
Master-Proxy liefert 502Öffentliche Datei-URL, DNS/TLS, Erreichbarkeit und ausgeschlossene private Ziele prüfen; Weiterleitungen entfernen
Online-Session ist ungültigÖffentliche serverUid nicht mit privatem masterKey verwechseln; Anmeldemodus, Schlüsselrotation, Ablauf und Zustimmung prüfen
/account oder Loginroute liefert 404API-Webroot, Apache-Rewrite/Authorization-Weitergabe und Master-Konfiguration prüfen
Dateien sind bereit, Spiel verbindet nichtUDP-Port, Firewall/NAT, Spielprotokoll und tatsächliche Server-/Clientkompatibilität prüfen
REL/ID.h / Address-Library-FehlerWelche Plugin-DLL bricht ab? Skyrim-Version, SKSE, benötigten Dateinamen und natives Datenformat gemeinsam prüfen
Neueste Adressdatei ist vorhanden, Fehler bleibtEine alte DLL kann die falsche Datei suchen oder das neue Format nicht lesen; die DLL aktualisieren statt die BIN-Datei umzubenennen
Clientdateien bleiben altManuelle Clientquelle im erweiterten Profil, tatsächlich verwendete runtimeSource und Hash des Katalogeintrags prüfen
Wiederherstellung verweigert ÄnderungenSpiel schließen, fremde Änderungen an verwalteten Dateien sichern und Journal erhalten; nicht blind löschen

Benötigst du Hilfe, nutze den SkyMP-Worlds-Discord. Ein einzelner behobener Ladefehler ist noch kein Nachweis, dass alle weiteren nativen Plugins zur Spielversion passen.

↑ Nach oben
17

Quellen, Versionsstand & Verantwortung

#

Die Anleitung wurde gegen Launcher 0.2.0, den lokalen Server-Quellstand auf Basis von Commit a037003d57890b26ed21936ac2432c987aced878 und die veröffentlichte Ressourcenimplementierung des verlinkten Forks geprüft. Stand: 22.10.2026. Spätere Commits, lokale Erweiterungen und fremde Forks können abweichen. Die im vorbereiteten Clientkatalog vorhandene Kombination ist keine Zusage für andere Spielversionen; ein vollständiger Spieltest bleibt Aufgabe der jeweiligen Freigabe.

Dieser Webbereich ist statisch und benötigt auf dem Webspace keinen Node-Prozess und keine Datenbank. Hauptseite, Dashboard, Master, Dateihost und Spielserver werden dadurch nicht automatisch bereitgestellt. Für den Betrieb bleiben die jeweiligen Betreiber und ihre geprüfte Server-/Clientkombination verantwortlich. Eine Garantie für die Integration in bestehende Server oder beliebige Modpakete wird nicht gegeben.

↑ Nach oben