Installation
Zehn Minuten, und die meiste Zeit davon wartet man darauf, dass der Server startet. Es gibt keine SQL-Datei zu importieren und kein zweites Programm auszuführen — die Tabellen erstellen sich beim ersten Start der Ressource von selbst.
Jeder Schritt unten endet damit, woran du erkennst, dass es geklappt hat, damit du nie mit offenen Fragen zum nächsten Schritt übergehst.
Bevor du beginnst
Abschnitt betitelt „Bevor du beginnst“| Was du brauchst | Warum |
|---|---|
| oxmysql, aktiv | Alles, was sich das Telefon merkt, liegt in deiner Datenbank |
| ESX, QBCore, QBox oder fmLib | Wird automatisch erkannt; du musst nicht angeben, welches |
| Ein FiveM-Server der letzten zwei Jahre | Der Web-Teil des Telefons nutzt das integrierte Node des Servers |
Sonst nichts. Kein npm, kein Build-Schritt, kein Webserver.
1. Den Ordner an Ort und Stelle ablegen
Abschnitt betitelt „1. Den Ordner an Ort und Stelle ablegen“Platziere mic_phone in deinem resources-Ordner — in einem Ordner mit eckigen Klammern ist es am ordentlichsten:
resources/[mic]/mic_phone/Behalte den Ordnernamen mic_phone bei. Es geht zwar nichts kaputt, wenn du ihn umbenennst, aber die Webadresse des Telefons wird aus dem Ordnernamen zusammengesetzt; alles, was dazu notiert wurde, würde sich dann ebenfalls ändern.
2. Nach den Abhängigkeiten starten
Abschnitt betitelt „2. Nach den Abhängigkeiten starten“In der server.cfg, unter oxmysql und unter deinem Framework:
ensure oxmysqlensure es_extended # or qb-core / qbx_coreensure mic_phoneEs hat geklappt, wenn die Konsole beim Start Folgendes anzeigt:
[mic_phone] web: door B listening on http://0.0.0.0:30125 · door A at /mic_phone/web/ on the game portWenn du stattdessen eine rote Fehlermeldung zu einem Framework siehst, starte mic_phone nach deinem Framework — das ist fast immer die Ursache.
3. Die Datenbank — nichts zu tun
Abschnitt betitelt „3. Die Datenbank — nichts zu tun“Der erste Start liest sql/schema.sql ein und erstellt alles Fehlende. Du wirst eine Reihe von Zeilen wie CREATE TABLE IF NOT EXISTS mic_phone_… durchlaufen sehen. Das war’s schon.
Es hat geklappt, wenn diese Zeilen einmalig und bei späteren Starts nie wieder erscheinen.
4. Spielern einen Gegenstand zum Öffnen geben
Abschnitt betitelt „4. Spielern einen Gegenstand zum Öffnen geben“Standardmäßig benötigt das Telefon ein Inventar-Item namens phone:
-- shared/config.luaConfig.Open = { RequireItem = true, Item = 'phone', ...}Die meisten ESX- und QB-Installationen haben dieses Item bereits. Anwender von ox_inventory: Füge es deiner Items-Liste hinzu, falls es dort noch fehlt. Möchtest du es erst einmal nur ausprobieren? Setze RequireItem = false und überspringe diesen Schritt komplett.
Es hat geklappt, wenn du beitrittst, das Item im Inventar hast und F1 das Telefon öffnet. /phone bewirkt dasselbe, und mit T entfaltet es sich zum Tablet, während es geöffnet ist.
5. Einstellungen nur für den Server
Abschnitt betitelt „5. Einstellungen nur für den Server“Kopiere die Beispieldatei und trage deine gewünschten Werte ein:
shared/server_config.example.lua → shared/server_config.luaDiese Datei wird ausschließlich als Server-Skript geladen, sodass niemals Inhalte davon an einen Client gelangen. Zwei Dinge befinden sich dort:
Fotos, Videos und Sprachnachrichten. Trage ein Fivemanage-Medien-Token in ServerConfig.Media.Token (oder die Convar FIVEMANAGE_MEDIA_API_KEY) ein, und das Telefon lädt Dateien selbstständig hoch und speichert lediglich den resultierenden Link. Ein Discord-Webhook dient als Fallback.
Wenn keines von beiden gesetzt ist, speichert
FallbackToDataUrldie Datei direkt in deiner Datenbank. Für einen schnellen Test ist das in Ordnung, im Livebetrieb jedoch sehr schwerfällig — wenige Sekunden Sprachaufnahme belegen Dutzende Kilobytes in jeder betroffenen Zeile. Setze ein Token oder deaktiviere diese Option, damit Uploads klar erkennbar fehlschlagen.
Discord-Webhooks. Eine URL pro Ereignis-Typ oder Default, um alles abzufangen. Der Webhook, den du unbedingt setzen solltest (selbst wenn du den Rest auslässt), ist Server: Er ist der einzige, der dich über den Server statt über einen Spieler informiert — etwa wenn sich die Adresse geändert hat oder ein Zertifikat nicht erneuert werden konnte.
Du bist fertig
Abschnitt betitelt „Du bist fertig“Das Telefon funktioniert. Alles Weitere ist optional.
Optional: Das Telefon auf einem echten Smartphone
Abschnitt betitelt „Optional: Das Telefon auf einem echten Smartphone“Spieler können das Telefon ihres Charakters auf ihrem eigenen Smartphone bedienen. Das ist bereits aktiv: Einstellungen › Verknüpfte Geräte auf dem Telefon im Spiel zeigt einen QR-Code an. Sie scannen diesen und tippen den angezeigten sechsstelligen Code im Spiel ein. Das Gerät agiert ab diesem Moment als dieser Charakter.
Über einfaches HTTP erhalten sie dadurch bereits Nachrichten, E-Mails, Kontakte, die Garage, Immobilien und den Rest. Was ein Browser einer unverschlüsselten Seite jedoch verweigert, ist das Beste:
| Einfaches HTTP | HTTPS | |
|---|---|---|
| Nachrichten, E-Mails, Garage, alles andere | ja | ja |
| Benachrichtigungen bei geschlossener App | nein | ja |
| Anrufe | nein | ja |
| Mikrofon, für Sprachnachrichten | nein | ja |
| Als App mit eigenem Icon installieren | nein | ja |
HTTPS erhalten, ohne etwas zu installieren
Abschnitt betitelt „HTTPS erhalten, ohne etwas zu installieren“Diese Ressource kann ihr eigenes Zertifikat anfordern und erneuern. Leite eine Domain auf deinen Server, öffne zwei Ports und fülle drei Zeilen aus:
-- 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' }, },}- Eine Domain. Auf einem VPS ist das ein A-Record, der auf die IP-Adresse zeigt. Keine Domain? Bei
duckdns.orgerhältst du in einer Minute kostenlos eine. - Port 80 und Port 443 in der Firewall freigeben. Port 80 wird nur geöffnet, während ein Zertifikat angefordert wird, und schließt sich sofort wieder, sobald die Challenge beantwortet wurde.
Es hat geklappt, wenn die Konsole Folgendes meldet:
https: asking for phone.yourserver.comhttps: port 80 open for the challengehttps: challenge port closedhttps: certificate in hand, good until 2027-01-31https: listening on https://phone.yourserver.com/Falls Port 443 belegt ist — manche Router belegen ihn für ihre eigene Administrationsseite — nutze stattdessen einen anderen Port: Port = 8443, leite 8443 weiter und setze Url = 'https://phone.yourserver.com:8443/'. Nur die Challenge muss zwingend über Port 80 laufen; ein Zertifikat gehört zu einem Domainnamen, nicht zu einem Port, und alles funktioniert weiterhin.
docs/HTTPS.md beschreibt die weiteren Szenarien: hinter dem Cfx.re-Proxy, hinter einem bereits laufenden Reverse-Proxy oder bei einem Hostanbieter, der keine Ports vergibt.
Wenn etwas nicht stimmt
Abschnitt betitelt „Wenn etwas nicht stimmt“phonehttps check — fragt den Testserver der Zertifizierungsstelle, ob er mit deiner Maschine kommunizieren kann. Führe dies zuerst aus, wenn kein Zertifikat ankommt: Es trennt deine Firewall von dieser Ressource.
phonehttps — aktueller Status des Zertifikats und Zeitpunkt der Erneuerung.
phoneduck — Status der Domain, falls dieser Server seine eigene DuckDNS-Adresse aktuell hält, und wann dies zuletzt gemeldet wurde. phoneduck now sendet die aktuelle Adresse und gibt die Antwort von DuckDNS aus. So lässt sich feststellen, ob ein Token falsch ist, ohne darauf warten zu müssen, dass sich die IP-Adresse ändert.
| Was du siehst | Was es bedeutet |
|---|---|
| Das Telefon öffnet sich nicht | Kein phone-Item vorhanden, oder RequireItem ist an und der Spieler trägt keines bei sich |
| Der QR-Code führt zu einem unerreichbaren Ziel | Setze ServerConfig.Web.Url manuell; die automatische Erkennung sieht nicht über einen Router hinweg, der den Port verschoben hat |
| Kein Zertifikat, Log macht die Challenge dafür verantwortlich | Port 80 erreicht diese Maschine nicht. Überprüfe Portweiterleitung und Firewall, in dieser Reihenfolge |
| Fotos sind riesig / die Datenbank wächst schnell | Kein Medien-Token hinterlegt, und FallbackToDataUrl speichert Dateien in der Datenbank |
| Anrufe zwischen zwei Spielern sind stumm | Voice steht auf auto und hat keine Voice-Ressource gefunden; trage deine in Config.Bridge.voice ein |
Bevor du deine Stadt eröffnest
Abschnitt betitelt „Bevor du deine Stadt eröffnest“shared/server_config.luagehört dir. Teile sie niemals und committe sie an keinen öffentlichen Ort; sie enthält dein Medien-Token und deine Webhook-URLs.- Leite den
Server-Webhook an einen Ort, den du liest. Er meldet, wenn die Eingangstür des Telefons ausgefallen ist, und ist die einzige Warnung, die du erhältst, bevor es dir ein Spieler mitteilt. - Schalte
Config.Debugaus, falls du es eingeschaltet hattest: Es gibt jede Bridge-Entscheidung in der Konsole aus. - Sicherheit ist zehn Minuten wert, wenn du eine öffentliche Stadt betreibst: Welche Annahmen diese Ressource über verbundene Clients trifft und welche Regeln sie durchsetzt, damit ein modifizierter Client niemals über den eigenen Charakter hinausgreifen kann.