Agency-Pad Przechowywanie Mediów
Teraz z AgencyOS27: darmowa aktualizacja dla wszystkich, którzy już mają tablet.

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 Pad są zapisywane przez sam skrypt, od wersji 27.1.1. Ty wybierasz gdzie:
| Magazyn | Instalacja | Dobre 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 R2 | Okoł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:
| Co | Zapisywanie trwa około |
|---|---|
| Zdjęcie | 1 sekunda |
| Wiadomość głosowa | poniżej 1 sekundy |
| 15-sekundowy klip wideo | 20 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
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)
},
}
| Ustawienie | Co robi |
|---|---|
RetentionDays | Pliki 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. |
MaxStorageGigabytes | Gdy wszystkie pliki łącznie przekroczą ten rozmiar, najstarsze są usuwane jako pierwsze. Ustaw 0 dla braku limitu. |
MaxFileMegabytes | Większe pliki są odrzucane. Ogranicza także klipy wideo i nagrania ekranu. |
TransferKilobytesPerSecond | Prę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
- Zaloguj się na dash.cloudflare.com (wystarczy darmowe konto).
- W menu po lewej stronie otwórz Magazyn & bazy danych a następnie R2 Object Storage.
- Dodaj subskrypcję R2. Przegląd pokazuje $0.00 do zapłaty teraz. Zaakceptuj regulamin i kliknij Aktywuj.
2. Utwórz bucket
- Kliknij Utwórz bucket.
- Nazwij to na przykład
myserver-media. Nazwy nie można później zmienić. - Pozostaw lokalizację włączoną Automatycznie oraz storage class w Standard.
- Kliknij Utwórz bucket.
3. Zezwól na podgląd plików
- Otwórz swój bucket i przejdź do Ustawienia.
- Poniżej Publiczny adres URL do developmentu, kliknij Włącz, typ
allowi potwierdź. - 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
- Nadal w Ustawienia, znajdź Polityka CORS i kliknij Dodaj.
- 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
- Wróć do R2 Object Storage i kliknij Zarządzaj tokenami API.
- Kliknij Utwórz token API (token konta wystarczy).
- Uprawnienia: Odczyt & zapis obiektów.
- W sekcji wyboru bucketu wybierz tylko twój bucket.
- Kliknij Utwórz. Cloudflare pokazuje Access Key ID oraz Secret Access Key tylko raz, skopiuj oba teraz.
- 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
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',
}
Następnie ustaw provider w config.lua i zrestartuj zasób:
AgencyPadConfig.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:
padmediatest 1
Agency Pad 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: padmediatest 1 big.
Problemy i rozwiązania
| Widzisz | Poprawka |
|---|---|
could not create the media tables w konsoli | oxmysql nie jest uruchomiony lub nie może połączyć się z bazą danych. Uruchom oxmysql przed agency-pad. |
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 403 | Klucz 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 Cloudflare | Brakuje polityki CORS z kroku 4 lub ma ona inną nazwę resource. |
| Zapisane zdjęcia nie wyświetlają się w Cloudflare | Publiczny adres URL deweloperski z kroku 3 jest wyłączony lub PublicUrl wskazuje na inny bucket. |
| Zapisywanie wideo trwa długo | Normalna z lokalnym magazynem danych, patrz Szybkość powyżej. Użyj Cloudflare R2 dla natychmiastowych klipów. |
| Stare zdjęcia zniknęły | RetentionDays 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.