Agency Docs
QBESX

Agency-Pad Medienspeicher

Jetzt mit AgencyOS27: kostenloses Update für alle, die das Pad schon haben.

v27.1.1Bezahlt7 Seiten

Wo Fotos, Videos und Sprachnachrichten gespeichert werden

Jedes Foto, jeder Videoclip, jede Bildschirmaufnahme und jede Sprachnachricht aus Agency Pad wird ab Version 27.1.1 vom Script selbst gespeichert. Du entscheidest, wo:

SpeicherEinrichtungGeeignet für
Lokal (Standard)Keine. Funktioniert direkt nach der Installation.Jeden Server. Die Dateien bleiben auf deinem eigenen Server, in deiner Datenbank.
Cloudflare R2Etwa 10 Minuten, einmalig. Kostenlos bis 10 GB.Server mit vielen Videos oder sehr vielen Spielern.

Fivemanage und Discord werden nicht mehr als Speicher verwendet. Discord-Webhooks stehen weiterhin für Logs zur Verfügung.

Lokaler Speicher (Standard)

Du musst nichts einrichten. Das Script legt beim ersten Start zwei Tabellen in deiner Datenbank an (agency_media und agency_media_parts) und speichert die Dateien dort. Du brauchst nur oxmysql, das das Script ohnehin benötigt.

Das bedeutet für dich:

  • Kein Konto, kein API-Schlüssel, keine zusätzliche Resource. Nichts läuft außerhalb deines Servers.
  • Updates sind sicher. Die Dateien liegen in der Datenbank, nicht im Resource-Ordner. Wenn du bei einem Update den Ordner ersetzt, bleibt jedes Foto erhalten.
  • Deine Datenbank-Backups enthalten die Medien. Die Datenbank wächst um etwa ein Drittel mehr als die Dateien selbst. Ein Foto braucht etwa 150 KB.
  • Agency Phone und Agency Pad teilen sich den Speicher. Ein Foto, das mit einem von beiden aufgenommen wurde, erscheint auch auf dem anderen, ebenso Fotos, die mit Agency Cloud synchronisiert wurden.
  • Die Agency Companion App zeigt sie ebenfalls an, auf iOS, Android und in der Web-App. Auch dafür musst du nichts einrichten.

Geschwindigkeit

Die Dateien laufen über die FiveM-Verbindung selbst, ohne das Spiel zu blockieren. FiveM begrenzt, wie schnell ein Spieler Daten an den Server senden kann (etwa 165 KB pro Sekunde). Deshalb gilt:

WasSpeichern dauert etwa
Foto1 Sekunde
Sprachnachrichtunter 1 Sekunde
Videoclip mit 15 Sekunden20 Sekunden (die Kamera zeigt den Fortschritt in Prozent)

Eine Datei anderen Spielern anzuzeigen geht schnell, ein ganzer Clip kommt in wenigen Sekunden an. Wenn dein Server viele Videos aufnimmt, speichert Cloudflare R2 Clips fast sofort.

Einstellungen in der config.lua

AgencyPadConfig.MediaStorage = {
    Provider = 'local',                -- 'local' or 'cloudflare'

    MaxFileMegabytes = 10,             -- largest single file (clips, recordings)
    TransferKilobytesPerSecond = 1000, -- 'local': how fast files are sent to players

    Local = {
        RetentionDays = 30,            -- delete files older than this (0 = keep forever)
        MaxStorageGigabytes = 10,      -- delete the oldest files above this (0 = no limit)
    },
}
EinstellungWas sie bewirkt
RetentionDaysÄltere Dateien werden automatisch einmal pro Stunde gelöscht. Ein gelöschtes Foto zeigt in der Galerie einen kleinen Platzhalter. Setze 0, um alles zu behalten.
MaxStorageGigabytesWenn alle Dateien zusammen größer werden, werden zuerst die ältesten gelöscht. Setze 0 für keine Grenze.
MaxFileMegabytesGrößere Dateien werden abgelehnt. Gilt auch für Videoclips und Bildschirmaufnahmen.
TransferKilobytesPerSecondGeschwindigkeit pro Spieler, wenn Dateien an Spieler gesendet werden. Das Spiel hat immer Vorrang.

Cloudflare R2, Schritt für Schritt

Cloudflare R2 ist kostenlos bis 10 GB Speicher, 1 Million Uploads und 10 Millionen Downloads pro Monat. Downloads kosten nie etwas. Cloudflare verlangt beim Aktivieren von R2 eine Zahlungsmethode, auch für den kostenlosen Tarif. Du zahlst nur, wenn du die kostenlosen Grenzen überschreitest.

1. R2 aktivieren

  1. Melde dich bei dash.cloudflare.com an (ein kostenloses Konto reicht).
  2. Öffne im Menü links Speicher und Datenbanken und dann R2 Object Storage.
  3. Klicke auf R2-Abonnement zu meinem Konto hinzufügen. Die Übersicht zeigt jetzt 0,00 $ fällig. Akzeptiere die Bedingungen und klicke auf Aktivieren.

2. Bucket erstellen

  1. Klicke auf Bucket erstellen.
  2. Gib ihm einen Namen, zum Beispiel myserver-media. Der Name lässt sich später nicht mehr ändern.
  3. Lass den Standort auf Automatisch und die Speicherklasse auf Standard.
  4. Klicke auf Bucket erstellen.

3. Dateien abrufbar machen

  1. Öffne deinen Bucket und gehe zu Einstellungen.
  2. Klicke unter Öffentliche Entwicklungs-URL auf Aktivieren, tippe allow ein und bestätige.
  3. Kopiere die Adresse, die erscheint. Sie sieht aus wie https://pub-1a2b3c….r2.dev. Das ist deine PublicUrl.

Cloudflare drosselt die r2.dev-Adresse bei sehr stark genutzten Servern. Wenn du eine eigene Domain bei Cloudflare hast, kannst du sie am selben Ort unter Benutzerdefinierte Domänen hinzufügen und diese Adresse stattdessen als PublicUrl verwenden.

4. Uploads aus dem Spiel erlauben

  1. Suche weiterhin unter Einstellungen die CORS-Richtlinie und klicke auf Hinzufügen.
  2. Lösche alles im Textfeld, füge das hier ein und klicke auf Speichern:
[
  {
    "AllowedOrigins": ["https://cfx-nui-agency-phone", "https://cfx-nui-agency-pad"],
    "AllowedMethods": ["PUT", "GET"],
    "AllowedHeaders": ["*"],
    "MaxAgeSeconds": 3600
  }
]

Ohne diesen Schritt kann das Spiel nichts hochladen, und Fotos werden nicht gespeichert. Wenn du den Resource-Ordner umbenannt hast, schreibe deinen Ordnernamen hinter cfx-nui-.

5. Schlüssel erstellen

  1. Gehe zurück zu R2 Object Storage und klicke auf API-Tokens verwalten.
  2. Klicke auf API-Token erstellen (ein Konto-Token ist in Ordnung).
  3. Berechtigungen: Objekt lesen und schreiben.
  4. Wähle bei der Bucket-Auswahl nur deinen Bucket.
  5. Klicke auf Erstellen. Cloudflare zeigt die Zugriffsschlüssel-ID und den Geheimen Zugriffsschlüssel nur ein einziges Mal an. Kopiere jetzt beide.
  6. Deine Konto-ID steht in der R2-Übersicht und ist auch der erste Teil der S3-Adresse (https://<Account ID>.r2.cloudflarestorage.com).

6. Im Script eintragen

Die Schlüssel kommen in die config_server.lua. Diese Datei wird nur vom Server gelesen und nie an Spieler gesendet. Trage sie nicht in die config.lua ein: Diese Datei wird an jeden Spieler gesendet.

-- config_server.lua
AgencyPadServerConfig.Cloudflare = {
    AccountId       = 'your account id',
    Bucket          = 'myserver-media',
    AccessKeyId     = 'your access key id',
    SecretAccessKey = 'your secret access key',
    PublicUrl       = 'https://pub-1a2b3c....r2.dev',
}

Stelle dann den Provider in der config.lua ein und starte die Resource neu:

AgencyPadConfig.MediaStorage = {
    Provider = 'cloudflare',
    ...
}

Die Server-Konsole zeigt jetzt Media: storage: Cloudflare R2, bucket myserver-media. Wenn etwas fehlt, sagt dir die Konsole, was. Bis es behoben ist, speichert das Script lokal weiter, damit die Kamera nie aufhört zu funktionieren.

Du nutzt Agency Phone und Agency Pad zusammen? Beide können denselben Bucket und denselben Schlüssel verwenden. Jedes legt seine Dateien in einem eigenen Ordner ab.

Prüfen, ob es funktioniert

Führe das in der Server-Konsole aus (oder als Admin im Spiel), mit der ID eines Spielers, der online ist:

padmediatest 1

Das Agency Pad des Spielers speichert ein kleines Testbild, lädt es so zurück, wie es jeder andere Spieler tun würde, zeigt es an und spielt eine kurze Sprachnachricht ab. Die Konsole antwortet:

Media test passed for player 1 in 1361 ms: upload ok, download ok, shown as picture ok, app markup and backgrounds ok, voice message plays ok

Hänge big an, um zusätzlich einen 6 MB großen Videoclip zu testen: padmediatest 1 big.

Probleme und Lösungen

Du siehstLösung
could not create the media tables in der Konsoleoxmysql läuft nicht oder erreicht die Datenbank nicht. Starte oxmysql vor agency-pad.
Provider is 'cloudflare', but config_server.lua is missing ...Einer der fünf Werte ist leer, oder PublicUrl beginnt nicht mit https://. Prüfe Schritt 6.
Fotos schlagen mit Cloudflare HTTP 403 fehlDer Schlüssel hat keine Schreibberechtigung für diesen Bucket, oder der Bucket-Name ist falsch. Prüfe Schritt 5.
Fotos schlagen bei Cloudflare mit Failed to fetch fehlDie CORS-Richtlinie aus Schritt 4 fehlt oder hat einen anderen Resource-Namen.
Gespeicherte Fotos werden bei Cloudflare nicht angezeigtDie Öffentliche Entwicklungs-URL aus Schritt 3 ist ausgeschaltet, oder PublicUrl zeigt auf einen anderen Bucket.
Ein Video braucht lange zum SpeichernBeim lokalen Speicher normal, siehe Geschwindigkeit oben. Nutze Cloudflare R2 für Clips ohne Wartezeit.
Alte Fotos sind wegRetentionDays hat sie gelöscht. Erhöhe den Wert oder setze 0.

Wechsel von Fivemanage oder Discord

Du musst nichts migrieren. Früher gespeicherte Fotos behalten ihre alten Links und bleiben sichtbar, solange der Dienst sie noch ausliefert. Alles Neue geht in den Speicher, den du gewählt hast. Die alten Einstellungen MediaStorageProvider, FiveManageApiUrl, FiveManageApiKey und ScreenshotWebhook werden ignoriert und können aus deiner Config gelöscht werden.

Sicherheit

  • Nur Spieler, die mit deinem Server verbunden sind, können hochladen. Jeder Upload wird vorher angekündigt und auf Typ und Größe geprüft.
  • Der Inhalt wird anhand der ersten Bytes geprüft. Eine Webseite oder ein Script kann nie als Foto getarnt gespeichert werden.
  • Dateinamen sind 128 Bit zufällig, sie lassen sich weder erraten noch auflisten.
  • Uploads und Downloads sind pro Spieler begrenzt.
  • Bei Cloudflare bekommt jeder Upload einen eigenen Link, der 5 Minuten gültig ist, für genau eine Datei eines Typs und einer Größe. Der geheime Schlüssel verlässt nie deinen Server.

Kommst du nach dieser Seite nicht weiter? Dann übernimmt unser Support.