Agency Docs
QBESXStandalone

Agency-Phone Przechowywanie Mediów

Teraz z AgencyOS27: darmowa aktualizacja dla wszystkich, którzy już mają telefon.

v27.1.2Płatny8 Strony

Gdzie przechowywane są zdjęcia, filmy i wiadomości głosowe

Każde zdjęcie, klip wideo, nagranie ekranu i wiadomość głosowa z Agency Phone są zapisywane przez sam skrypt, od wersji 27.1.1. Ty wybierasz gdzie:

MagazynInstalacjaDobre dla
Lokalny (domyślnie)Brak. Działa od razu po instalacji.Każdy serwer. Pliki pozostają na Twoim własnym serwerze, w Twojej bazie danych.
Cloudflare R2Około 10 minut, jednorazowo. Bezpłatnie do 10 GB.Serwery z dużą ilością wideo lub bardzo dużą liczbą graczy.

Fivemanage i Discord nie są już używane jako magazyn danych. Webhooki Discord są nadal dostępne dla logów.

Pamięć lokalna (domyślnie)

Nie musisz niczego konfigurować. Skrypt tworzy dwie tabele w Twojej bazie danych przy pierwszym uruchomieniu (agency_media i agency_media_parts) i tam przechowuje pliki. Potrzebujesz tylko oxmysql, którego skrypt i tak wymaga.

Co to oznacza dla ciebie:

  • Bez konta, bez klucza API, bez dodatkowego resource. Nic nie działa poza Twoim serwerem.
  • Aktualizacje są bezpieczne. Pliki znajdują się w bazie danych, a nie w folderze zasobu, więc podmienienie folderu podczas aktualizacji zachowuje każde zdjęcie.
  • Kopie zapasowe twojej bazy danych obejmują pliki multimedialne. Baza danych rośnie o około jedną trzecią bardziej niż same pliki. Zdjęcie zajmuje około 150 KB.
  • Agency Phone i Agency Pad współdzielą pamięć. Zdjęcie zrobione na jednym z nich pojawia się na drugim, w tym zdjęcia zsynchronizowane z Agency Cloud.
  • Aplikacja Agency Companion również je pokazuje, na iOS, Androidzie i w aplikacji webowej. Tutaj również nie musisz niczego konfigurować.

Prędkość

Pliki przesyłane są przez samo połączenie FiveM, bez blokowania gry. FiveM ogranicza prędkość wysyłania danych przez gracza na serwer (około 165 KB na sekundę), więc:

CoZapisywanie trwa około
Zdjęcie1 sekunda
Wiadomość głosowaponiżej 1 sekundy
15-sekundowy klip wideo20 sekund (kamera pokazuje postęp w procentach)

Pokazywanie pliku innym graczom jest szybkie, cały klip dociera w kilka sekund. Jeśli Twój serwer nagrywa dużo wideo, Cloudflare R2 zapisuje klipy niemal natychmiast.

Ustawienia w config.lua

AgencyConfig.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)
    },
}
UstawienieCo robi
RetentionDaysPliki starsze niż ten czas są usuwane automatycznie raz na godzinę. Usunięte zdjęcie wyświetla mały symbol zastępczy w galerii. Ustaw 0 aby zachować wszystko.
MaxStorageGigabytesGdy wszystkie pliki łącznie przekroczą ten rozmiar, najstarsze są usuwane jako pierwsze. Ustaw 0 dla braku limitu.
MaxFileMegabytesWiększe pliki są odrzucane. Ogranicza także klipy wideo i nagrania ekranu.
TransferKilobytesPerSecondPrędkość na gracza podczas wysyłania plików do graczy. Gra ma zawsze priorytet.

Cloudflare R2, krok po kroku

Cloudflare R2 jest bezpłatne do 10 GB pamięci, 1 miliona przesłanych plików i 10 milionów pobrań miesięcznie, a pobieranie nigdy nic nie kosztuje. Cloudflare prosi o podanie metody płatności przy aktywacji R2, nawet w przypadku darmowego planu. Płacisz tylko wtedy, gdy przekroczysz darmowe limity.

1. Włącz R2

  1. Zaloguj się na dash.cloudflare.com (wystarczy darmowe konto).
  2. W menu po lewej stronie otwórz Magazyn & bazy danych a następnie R2 Object Storage.
  3. Dodaj subskrypcję R2. Przegląd pokazuje $0.00 do zapłaty teraz. Zaakceptuj regulamin i kliknij Aktywuj.

2. Utwórz bucket

  1. Kliknij Utwórz bucket.
  2. Nazwij to na przykład myserver-media. Nazwy nie można później zmienić.
  3. Pozostaw lokalizację włączoną Automatycznie oraz storage class w Standard.
  4. Kliknij Utwórz bucket.

3. Zezwól na podgląd plików

  1. Otwórz swój bucket i przejdź do Ustawienia.
  2. Poniżej Publiczny adres URL do developmentu, kliknij Włącz, typ allow i potwierdź.
  3. Skopiuj adres, który się wyświetli, wygląda on tak: https://pub-1a2b3c….r2.dev. To twój PublicUrl.

Cloudflare ogranicza adres r2.dev dla mocno obciążonych serwerów. Jeśli masz własną domenę w Cloudflare, możesz dodać ją w Własne domeny w tym samym miejscu i użyj tego adresu jako PublicUrl.

4. Zezwól na przesyłanie plików z gry

  1. Nadal w Ustawienia, znajdź Polityka CORS i kliknij Dodaj.
  2. Usuń wszystko z pola tekstowego, wklej to i kliknij Zapisz:
[
  {
    "AllowedOrigins": ["https://cfx-nui-agency-phone", "https://cfx-nui-agency-pad"],
    "AllowedMethods": ["PUT", "GET"],
    "AllowedHeaders": ["*"],
    "MaxAgeSeconds": 3600
  }
]

Bez tego kroku gra nie może przesyłać plików, a zdjęcia nie zostaną zapisane. Jeśli zmieniono nazwę folderu zasobu, wpisz nazwę swojego folderu po cfx-nui-.

5. Utwórz klucz

  1. Wróć do R2 Object Storage i kliknij Zarządzaj tokenami API.
  2. Kliknij Utwórz token API (token konta wystarczy).
  3. Uprawnienia: Odczyt & zapis obiektów.
  4. W sekcji wyboru bucketu wybierz tylko twój bucket.
  5. Kliknij Utwórz. Cloudflare pokazuje Access Key ID oraz Secret Access Key tylko raz, skopiuj oba teraz.
  6. Twój ID konta jest widoczny w przeglądzie R2 i stanowi również pierwszą część adresu S3 (https://<Account ID>.r2.cloudflarestorage.com).

6. Wpisz go w skrypcie

Klucze trafiają do config_server.lua. Ten plik jest odczytywany wyłącznie przez serwer i nigdy nie jest wysyłany do graczy. Nie umieszczaj ich w config.lua: ten plik jest wysyłany do każdego gracza.

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

Następnie ustaw provider w config.lua i zrestartuj zasób:

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

Konsola serwera wyświetla teraz Media: storage: Cloudflare R2, bucket myserver-media. Jeśli czegoś brakuje, konsola informuje o co chodzi, a skrypt zapisuje dane lokalnie do momentu naprawy błędu, dzięki czemu kamera nigdy nie przestaje działać.

Używasz Agency Phone i Agency Pad razem? Oba mogą korzystać z tego samego bucketu i tego samego klucza, a każdy przechowuje swoje pliki we własnym folderze.

Sprawdź, czy to działa

Uruchom to w konsoli serwera (lub jako admin w grze), podając ID gracza będącego online:

phonemediatest 1

Agency Phone gracza zapisuje małe zdjęcie testowe, wczytuje je z powrotem tak, jak zrobiłby to każdy inny gracz, wyświetla je i odtwarza krótką wiadomość głosową. Konsola odpowiada:

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

Dodaj big aby przetestować również klip wideo o rozmiarze 6 MB: phonemediatest 1 big.

Problemy i rozwiązania

WidziszPoprawka
could not create the media tables w konsolioxmysql nie jest uruchomiony lub nie może połączyć się z bazą danych. Uruchom oxmysql przed agency-phone.
Provider is 'cloudflare', but config_server.lua is missing ...Jedna z pięciu wartości jest pusta lub PublicUrl nie zaczyna się od https://. Sprawdź krok 6.
Zdjęcia kończą się błędem Cloudflare HTTP 403Klucz nie ma uprawnień do zapisu w tym buckecie lub nazwa bucketu jest nieprawidłowa. Sprawdź krok 5.
Zdjęcia kończą się błędem Failed to fetch na CloudflareBrakuje polityki CORS z kroku 4 lub ma ona inną nazwę resource.
Zapisane zdjęcia nie wyświetlają się w CloudflarePubliczny adres URL deweloperski z kroku 3 jest wyłączony lub PublicUrl wskazuje na inny bucket.
Zapisywanie wideo trwa długoNormalna z lokalnym magazynem danych, patrz Szybkość powyżej. Użyj Cloudflare R2 dla natychmiastowych klipów.
Stare zdjęcia zniknęłyRetentionDays je usunął. Zwiększ tę wartość lub ustaw 0.

Przejście z Fivemanage lub Discord

Nie ma czego migrować. Wcześniej zapisane zdjęcia zachowują stare linki i pozostają widoczne tak długo, jak długo dana usługa je dostarcza. Wszystko nowe trafia do wybranego magazynu danych. Stare ustawienia MediaStorageProvider, FiveManageApiUrl, FiveManageApiKey i ScreenshotWebhook są ignorowane i można je usunąć z Twojego configu.

Bezpieczeństwo

  • Tylko gracze połączeni z Twoim serwerem mogą przesyłać pliki. Każde przesłanie jest najpierw ogłaszane i sprawdzane pod kątem typu oraz rozmiaru.
  • Zawartość jest weryfikowana na podstawie jej pierwszych bajtów. Strona internetowa ani skrypt nigdy nie zostaną zapisane w przebraniu zdjęcia.
  • Nazwy plików są losowe w standardzie 128-bitowym, nie można ich odgadnąć ani wyświetlić na liście.
  • Przesyłanie i pobieranie plików jest ograniczone na gracza.
  • Z Cloudflare każdy upload otrzymuje własny link ważny przez 5 minut, na dokładnie jeden plik o określonym typie i rozmiarze. Klucz prywatny nigdy nie opuszcza twojego serwera.

Nadal nie idzie po tej stronie? Nasze wsparcie przejmuje sprawę.