Zum Inhalt springen

Das Zertifikat

Du benötigst dies nicht, um das Telefon zu nutzen. Direkt nach der Installation, ganz ohne Konfiguration, scannt ein Spieler den QR-Code unter Einstellungen › Verknüpfte Geräte und sein echtes Smartphone wird zum Telefon seines Charakters: Nachrichten, E-Mails, Kontakte, City-ID, Garage, Immobilien, schwarzes Brett, gespeicherte Orte. All das funktioniert über einfaches HTTP auf dem Port, den dein Server ohnehin geöffnet hat.

Was ein Zertifikat ergänzt, ist der Teil, den ein Browser einer ungesicherten Webseite verweigert:

Einfaches HTTPHTTPS
Nachrichten, E-Mails, Garage, alles anderejaja
Benachrichtigungen bei geschlossener Seiteneinja
Das Mikrofon, um Sprachnachrichten aufzunehmenneinja
Als App installieren auf Android, mit eigenem Iconneinja
“Nicht sicher” in der Adressleistesichtbarunsichtbar
Das Session-Tokenreist unverschlüsseltverschlüsselt

Die letzte Zeile ist keineswegs nur Kosmetik. Über einfaches HTTP kann jeder im selben WLAN wie dein Spieler dessen Sitzung abfangen und dessen Telefon mitlesen. Für einen Roleplay-Server mag das ein vertretbarer Kompromiss sein; es sollte jedoch zumindest eine bewusste Entscheidung und keine böse Überraschung sein.

Du hast eine Domain, die auf den Server zeigt — Lass das Telefon sein eigenes Zertifikat holen

Abschnitt betitelt „Du hast eine Domain, die auf den Server zeigt — Lass das Telefon sein eigenes Zertifikat holen“

Das ist der unkomplizierteste Weg, der keinerlei zusätzliche Software auf der Maschine voraussetzt. Die Ressource fordert bei Let’s Encrypt ein Zertifikat an, beantwortet die Challenge selbstständig, wickelt TLS eigenhändig ab und erneuert sich automatisch, solange sie läuft.

-- shared/server_config.lua (server-only: this file is never sent to a client)
ServerConfig.Web = {
Url = 'https://phone.yourserver.com/',
Https = {
Enabled = true,
Names = { 'phone.yourserver.com' },
Contact = '[email protected]',
},
}

Danach einmalig:

  1. Leite die Domain auf deinen Server. Auf einem VPS ist das ein einfacher A-Record. Keine eigene Domain? Bei duckdns.org erhältst du in einer Minute kostenlos eine, die sich nie ändert.
  2. Gib die Ports 443 und 80 in der Firewall frei. Port 80 wird ausschließlich geöffnet, während ein Zertifikat angefragt wird, und unmittelbar nach erhaltener Antwort wieder geschlossen — das Server-Log dokumentiert beide Vorgänge.

Der Befehl phonehttps zeigt den aktuellen Status des Zertifikats an. phonehttps check fragt den Testserver von Let’s Encrypt, ob er überhaupt mit dieser Maschine sprechen kann — das ist der beste erste Schritt, falls kein Zertifikat eintrifft: Es trennt deine Firewall von dieser Ressource.

Die Erneuerung läuft vollautomatisch, sobald noch ein Drittel der Zertifikatslaufzeit verbleibt; eine Prüfung erfolgt alle sechs Stunden.

Wenn der Server zu Hause steht, wechselt die IP-Adresse

Abschnitt betitelt „Wenn der Server zu Hause steht, wechselt die IP-Adresse“

Ein Internetanbieter weist einem Privatanschluss nach Belieben eine neue Adresse zu; sobald dies geschieht, zeigt die Domain auf den Router eines Fremden: Gekoppelte Telefone erreichen den Server nicht mehr und das Zertifikat kann nicht erneuert werden. Diese Ressource registriert dies ohnehin — sie prüft ihre eigene IP alle 30 Minuten für den QR-Code — und kann dies bei einer DuckDNS-Domain auch direkt korrigieren:

-- shared/server_config.lua
DuckDNS = {
Enabled = true,
Domains = { 'yourname' }, -- the part in front of .duckdns.org
Token = '01d8b39f-...', -- from your duckdns.org page
},

Sie wird benachrichtigt, wenn sich die IP-Adresse ändert, und einmal täglich, wenn sie unverändert blieb — dieser Heartbeat biegt die Zuordnung auch nach einem Internetausfall wieder gerade, bei dem die Adressänderung ohne Verbindung stattfand. Klappt die Aktualisierung, wird dies im Log vermerkt; schlägt sie fehl, wird wie gewohnt die Fehlermeldung ausgegeben und an den Server-Webhook gesendet.

Auf einem VPS ändert sich die IP-Adresse nicht; dort wird dies nicht benötigt. Belasse Enabled = false.

Nichts zu tun. Wenn sv_listingHostOverride gesetzt ist, wird der QR-Code automatisch als https://your.domain/mic_phone/web/ zusammengesetzt, da dieser Proxy die gesamte Root-URL an deinen Server durchreicht. Dies ist der einfachste Fall und bereits vollständig abgedeckt.

Du betreibst bereits einen Reverse-Proxy und möchtest diesen beibehalten

Abschnitt betitelt „Du betreibst bereits einen Reverse-Proxy und möchtest diesen beibehalten“

Eine Zeile in shared/config/web.lua:

Url = 'https://phone.yourserver.com/mic_phone/web/',

sowie ein vorgeschalteter Reverse-Proxy, der TLS terminiert und an den FiveM-Gameport weiterleitet. Bei Caddy genügt ein Zweizeiler im Caddyfile:

phone.yourserver.com {
reverse_proxy 127.0.0.1:30120
}

Bei nginx leite / auf 127.0.0.1:30120 weiter und deaktiviere das Buffering (proxy_buffering off;), andernfalls wird der Event-Stream zurückgehalten und das Telefon empfängt keine Echtzeitdaten mehr.

Was nicht funktioniert: Die orangefarbene Cloud auf einem DNS-Record aktivieren, der auf Port 30120 zeigt. Der Cloudflare-Proxy akzeptiert nur eine feste Auswahl an Origin-Ports — 80, 8080, 8880, 2052, 2082, 2086, 2095 sowie 443, 2053, 2083, 2087, 2096, 8443 — und 30120 gehört nicht dazu. Du benötigst wie oben beschrieben einen eigenen Reverse-Proxy davor.

Du mietest deinen Server bei einem Game-Server-Hoster

Abschnitt betitelt „Du mietest deinen Server bei einem Game-Server-Hoster“

Du kannst auf dieser Maschine nichts installieren — musst du aber auch nicht: Die erstgenannte Option installiert nichts weiter, es ist diese Ressource. Was du von deinem Hoster benötigst, sind zwei eigene Ports (443 und 80) sowie eine Domain, die auf den Server verweist. Viele Hoster stellen dir beides bereit; manche teilen diese Ports unter allen Kunden auf der Maschine und verweigern beides. Frage vor allem anderen nach diesen Ports; lautet die Antwort nein, leite eine Domain stattdessen auf einen benannten Cloudflare-Tunnel.

Du kannst keinerlei Ports öffnen — Keine Domain oder der Provider blockiert

Abschnitt betitelt „Du kannst keinerlei Ports öffnen — Keine Domain oder der Provider blockiert“

Dann hilft ein Tunnel: tools/tunnel.ps1 startet einen Cloudflare Quick-Tunnel, schreibt die empfangene Adresse in die Config und fordert dich zum Neustart der Ressource auf. Ganz ohne Portfreigabe und ohne Zertifikat.

Bedenke jedoch: Ein Quick-Tunnel ist bewusst flüchtig. Die Adresse ist zufällig und bei jedem Neustart des Tunnels wird eine neue Adresse vergeben — und da ein Browser eine installierte App, ihr gespeichertes Token und ihr Push-Abonnement fest an die Ursprungsadresse bindet, muss dies jedes Mal neu eingerichtet werden. Es eignet sich hervorragend zum Ausprobieren. Für den Dauerbetrieb leite eine Domain auf einen benannten Tunnel (Named Tunnel), der seine Adresse dauerhaft behält — dafür sind ein Cloudflare-Account und eine darin hinterlegte Domain erforderlich.

Das Telefon hält eine dauerhafte Verbindung offen, um Nachrichten unmittelbar bei deren Eintreffen zu empfangen, und öffnet diese mit einem POST statt des üblichen EventSource-GET. Aus zwei Gründen, die man bei einer Proxy-Einrichtung kennen sollte:

  • Ein Token im Query-String wird in jedes Proxy-Log zwischen Telefon und Server geschrieben. Im Body eines POST-Requests geschieht dies nicht.
  • Ein Cloudflare Quick-Tunnel hält einen GET-Event-Stream geschlossen, bis der Server die Verbindung trennt, lässt einen POST-Stream jedoch anstandslos durch (cloudflared#1449). Zahlreiche Proxys puffern GET-Streams standardmäßig.

Der Server antwortet auf denselben Routen auch auf GET-Anfragen für Clients, die ausschließlich EventSource beherrschen.