Agency Docs
QBESXStandalone

Agency-Phone मीडिया स्टोरेज

अब AgencyOS27 के साथ: जिनके पास पहले से फ़ोन है उनके लिए मुफ़्त अपडेट। FiveM के लिए एक आधुनिक फ़ोन जो QBCore, ESX या.

v27.1.1सशुल्क8 पेज

फ़ोटो, वीडियो और वॉइस मैसेज कहाँ स्टोर होते हैं

Agency Phone का हर फ़ोटो, वीडियो क्लिप, स्क्रीन रिकॉर्डिंग और वॉइस मैसेज वर्शन 27.1.1 से स्क्रिप्ट खुद सेव करती है। कहाँ सेव हो, यह आप चुनते हैं:

स्टोरेजसेटअपकिसके लिए अच्छा है
Local (डिफ़ॉल्ट)कुछ नहीं करना। इंस्टॉल करते ही काम करता है।हर server के लिए। फ़ाइलें आपके अपने server पर, आपके database में रहती हैं।
Cloudflare R2लगभग 10 मिनट, सिर्फ़ एक बार। 10 GB तक मुफ़्त।ऐसे server जहाँ बहुत वीडियो बनते हैं, या जहाँ बहुत ज़्यादा प्लेयर्स हैं।

Fivemanage और Discord अब स्टोरेज के तौर पर इस्तेमाल नहीं होते। Discord webhooks लॉग्स के लिए अब भी उपलब्ध हैं।

Local स्टोरेज (डिफ़ॉल्ट)

कुछ भी सेटअप करने की ज़रूरत नहीं है। स्क्रिप्ट पहली बार शुरू होने पर आपके database में दो टेबल बनाती है (agency_media और agency_media_parts) और फ़ाइलें वहीं स्टोर करती है। आपको सिर्फ़ oxmysql चाहिए, जो स्क्रिप्ट को वैसे भी चाहिए।

आपके लिए इसका मतलब:

  • कोई अकाउंट नहीं, कोई API key नहीं, कोई अतिरिक्त resource नहीं। आपके server के बाहर कुछ नहीं चलता।
  • अपडेट सुरक्षित हैं। फ़ाइलें database में हैं, resource फ़ोल्डर में नहीं, इसलिए अपडेट पर फ़ोल्डर बदलने से कोई फ़ोटो नहीं जाता।
  • आपके database backups में मीडिया भी शामिल है। Database फ़ाइलों के असली आकार से लगभग एक तिहाई ज़्यादा बढ़ता है। एक फ़ोटो लगभग 150 KB का होता है।
  • Agency Phone और Agency Pad स्टोरेज साझा करते हैं। एक से ली गई फ़ोटो दूसरे में भी दिखती है, Agency Cloud से सिंक की गई फ़ोटो भी।
  • Agency Companion ऐप भी इन्हें दिखाता है, iOS, Android और web app पर। इसके लिए भी कुछ सेटअप नहीं करना।

स्पीड

फ़ाइलें FiveM कनेक्शन से ही जाती हैं, गेम को रोके बिना। FiveM यह सीमित करता है कि एक प्लेयर server को कितनी तेज़ी से डेटा भेज सकता है (लगभग 165 KB प्रति सेकंड), इसलिए:

क्यासेव होने में लगभग
फ़ोटो1 सेकंड
वॉइस मैसेज1 सेकंड से कम
15 सेकंड की वीडियो क्लिप20 सेकंड (कैमरा प्रोग्रेस प्रतिशत में दिखाता है)

दूसरे प्लेयर्स को फ़ाइल दिखाना तेज़ है, पूरी क्लिप कुछ ही सेकंड में पहुँच जाती है। अगर आपके server पर बहुत वीडियो रिकॉर्ड होते हैं, तो Cloudflare R2 क्लिप्स लगभग तुरंत सेव कर देता है।

config.lua में सेटिंग्स

AgencyConfig.MediaStorage = {
    Provider = 'local',                -- 'local' या 'cloudflare'

    MaxFileMegabytes = 10,             -- सबसे बड़ी एक फ़ाइल (क्लिप, रिकॉर्डिंग)
    TransferKilobytesPerSecond = 1000, -- 'local': फ़ाइलें प्लेयर्स को कितनी तेज़ी से भेजी जाती हैं

    Local = {
        RetentionDays = 30,            -- इससे पुरानी फ़ाइलें हटा दी जाती हैं (0 = हमेशा रखें)
        MaxStorageGigabytes = 10,      -- इससे ऊपर जाने पर सबसे पुरानी फ़ाइलें हटा दी जाती हैं (0 = कोई सीमा नहीं)
    },
}
सेटिंगयह क्या करती है
RetentionDaysइससे पुरानी फ़ाइलें हर घंटे अपने आप हट जाती हैं। हटाई गई फ़ोटो की जगह गैलरी में एक छोटा प्लेसहोल्डर दिखता है। सब कुछ रखने के लिए 0 सेट करें।
MaxStorageGigabytesजब सारी फ़ाइलें मिलाकर इससे बड़ी हो जाती हैं, तो सबसे पुरानी पहले हटाई जाती हैं। कोई सीमा न चाहिए तो 0 सेट करें।
MaxFileMegabytesइससे बड़ी फ़ाइलें मना कर दी जाती हैं। वीडियो क्लिप और स्क्रीन रिकॉर्डिंग पर भी यही सीमा लागू होती है।
TransferKilobytesPerSecondप्लेयर्स को फ़ाइलें भेजते समय हर प्लेयर के लिए स्पीड। गेम को हमेशा प्राथमिकता मिलती है।

Cloudflare R2, स्टेप बाय स्टेप

Cloudflare R2 हर महीने 10 GB स्टोरेज, 10 लाख अपलोड और 1 करोड़ डाउनलोड तक मुफ़्त है, और डाउनलोड पर कभी कोई पैसा नहीं लगता। R2 चालू करते समय Cloudflare पेमेंट मेथड माँगता है, फ़्री प्लान के लिए भी। पैसे तभी लगते हैं जब आप मुफ़्त सीमा से ऊपर जाते हैं।

1. R2 चालू करें

  1. dash.cloudflare.com पर लॉग इन करें (फ़्री अकाउंट काफ़ी है)।
  2. बाईं ओर के मेन्यू में Storage & databases खोलें और फिर R2 Object Storage।
  3. R2 सब्सक्रिप्शन जोड़ें। ओवरव्यू में अभी देय राशि $0.00 दिखती है। शर्तें स्वीकार करें और Activate पर क्लिक करें।

2. बकेट बनाएँ

  1. Create bucket पर क्लिक करें।
  2. उसका नाम रखें, जैसे myserver-media। यह नाम बाद में बदला नहीं जा सकता।
  3. लोकेशन Automatic और स्टोरेज क्लास Standard पर ही रहने दें।
  4. Create bucket पर क्लिक करें।

3. फ़ाइलों को देखने लायक बनाएँ

  1. अपना बकेट खोलें और Settings में जाएँ।
  2. Public Development URL के नीचे Enable पर क्लिक करें, allow टाइप करें और कन्फ़र्म करें।
  3. जो पता दिखे उसे कॉपी करें, वह कुछ ऐसा दिखता है https://pub-1a2b3c….r2.dev। यही आपका PublicUrl है।

बहुत व्यस्त server के लिए Cloudflare r2.dev पते पर सीमा लगाता है। अगर Cloudflare पर आपका अपना डोमेन है, तो उसी जगह Custom Domains के नीचे उसे जोड़ सकते हैं और PublicUrl की जगह वह पता इस्तेमाल कर सकते हैं।

4. गेम से अपलोड की अनुमति दें

  1. अब भी Settings में रहते हुए CORS Policy ढूँढें और Add पर क्लिक करें।
  2. टेक्स्ट फ़ील्ड में जो कुछ है उसे मिटा दें, यह चिपकाएँ और Save पर क्लिक करें:
[
  {
    "AllowedOrigins": ["https://cfx-nui-agency-phone", "https://cfx-nui-agency-pad"],
    "AllowedMethods": ["PUT", "GET"],
    "AllowedHeaders": ["*"],
    "MaxAgeSeconds": 3600
  }
]

इस स्टेप के बिना गेम अपलोड नहीं कर पाता और फ़ोटो सेव नहीं होतीं। अगर आपने resource फ़ोल्डर का नाम बदला है, तो cfx-nui- के बाद अपने फ़ोल्डर का नाम लिखें।

5. की (key) बनाएँ

  1. वापस R2 Object Storage पर जाएँ और Manage API tokens पर क्लिक करें।
  2. Create API token पर क्लिक करें (account token ठीक है)।
  3. Permissions: Object Read & Write।
  4. बकेट चुनने वाली जगह पर सिर्फ़ अपना बकेट चुनें।
  5. Create पर क्लिक करें। Cloudflare Access Key ID और Secret Access Key सिर्फ़ एक बार दिखाता है, दोनों अभी कॉपी कर लें।
  6. आपका Account ID R2 ओवरव्यू पर दिखता है, और वही S3 पते का पहला हिस्सा भी है (https://<Account ID>.r2.cloudflarestorage.com)।

6. इसे स्क्रिप्ट में डालें

Keys config_server.lua में जाती हैं। इस फ़ाइल को सिर्फ़ server पढ़ता है और यह कभी प्लेयर्स को नहीं भेजी जाती। इन्हें config.lua में न डालें: वह फ़ाइल हर प्लेयर को भेजी जाती है।

-- 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',
}

फिर config.lua में provider सेट करें और resource को रीस्टार्ट करें:

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

अब server कंसोल में Media: storage: Cloudflare R2, bucket myserver-media दिखता है। अगर कुछ छूटा है, तो कंसोल बताता है कि क्या, और जब तक ठीक नहीं होता स्क्रिप्ट local ही सेव करती रहती है, इसलिए कैमरा कभी काम करना बंद नहीं करता।

Agency Phone और Agency Pad एक साथ इस्तेमाल कर रहे हैं? दोनों एक ही बकेट और एक ही key इस्तेमाल कर सकते हैं, हर एक अपनी फ़ाइलें अपने अलग फ़ोल्डर में रखता है।

जाँचें कि यह काम कर रहा है

इसे server कंसोल में चलाएँ (या गेम में एडमिन के तौर पर), किसी ऑनलाइन प्लेयर की ID के साथ:

phonemediatest 1

उस प्लेयर का Agency Phone एक छोटी टेस्ट तस्वीर सेव करता है, उसे वैसे ही वापस लोड करता है जैसे कोई दूसरा प्लेयर करता, उसे दिखाता है, और एक छोटा वॉइस मैसेज चलाता है। कंसोल यह जवाब देता है:

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

6 MB की वीडियो क्लिप भी टेस्ट करने के लिए big जोड़ें: phonemediatest 1 big।

समस्याएँ और समाधान

आपको क्या दिखता हैसमाधान
कंसोल में could not create the media tablesoxmysql चल नहीं रहा है या database तक नहीं पहुँच पा रहा। oxmysql को agency-phone से पहले स्टार्ट करें।
Provider is 'cloudflare', but config_server.lua is missing ...पाँच में से कोई एक वैल्यू खाली है, या PublicUrl https:// से शुरू नहीं होता। स्टेप 6 देखें।
फ़ोटो Cloudflare HTTP 403 के साथ फ़ेल होती हैंKey को इस बकेट के लिए लिखने की अनुमति नहीं है, या बकेट का नाम गलत है। स्टेप 5 देखें।
Cloudflare पर फ़ोटो Failed to fetch के साथ फ़ेल होती हैंस्टेप 4 की CORS policy नहीं है या उसमें resource का नाम अलग है।
Cloudflare पर सेव की गई फ़ोटो नहीं दिखतींस्टेप 3 का Public Development URL बंद है, या PublicUrl किसी दूसरे बकेट की ओर इशारा करता है।
वीडियो सेव होने में बहुत समय लगता हैLocal स्टोरेज में यह सामान्य है, ऊपर स्पीड देखें। तुरंत क्लिप्स के लिए Cloudflare R2 इस्तेमाल करें।
पुरानी फ़ोटो गायब हैंRetentionDays ने उन्हें हटा दिया। इसे बढ़ाएँ या 0 सेट करें।

Fivemanage या Discord से आ रहे हैं

कुछ माइग्रेट नहीं करना है। पहले सेव की गई फ़ोटो अपने पुराने लिंक रखती हैं और तब तक दिखती रहती हैं जब तक वह सर्विस उन्हें देती रहे। हर नई चीज़ आपके चुने हुए स्टोरेज में जाती है। पुरानी सेटिंग्स MediaStorageProvider, FiveManageApiUrl, FiveManageApiKey और ScreenshotWebhook अनदेखी की जाती हैं और आपके config से हटाई जा सकती हैं।

सुरक्षा

  • सिर्फ़ आपके server से जुड़े प्लेयर्स ही अपलोड कर सकते हैं। हर अपलोड पहले घोषित किया जाता है और उसका टाइप और साइज़ जाँचा जाता है।
  • कंटेंट की जाँच उसके शुरुआती bytes से होती है। कोई वेब पेज या स्क्रिप्ट फ़ोटो के भेष में कभी स्टोर नहीं हो सकती।
  • फ़ाइल नाम 128-bit रैंडम होते हैं, उनका अंदाज़ा नहीं लगाया जा सकता और उनकी लिस्ट नहीं बनाई जा सकती।
  • अपलोड और डाउनलोड हर प्लेयर के हिसाब से सीमित हैं।
  • Cloudflare के साथ, हर अपलोड को अपना अलग लिंक मिलता है जो 5 मिनट तक वैध रहता है, ठीक एक टाइप की एक फ़ाइल और एक साइज़ के लिए। Secret key आपके server से कभी बाहर नहीं जाती।

इस पेज के बाद भी अटके हैं? आगे हमारा सपोर्ट संभाल लेगा।