Agency Docs
QBESX

Agency-Pad Almacenamiento Multimedia

Ahora con AgencyOS27: una actualización gratuita para todos los que ya tienen el pad.

v27.1.1De pago7 Páginas

Dónde se guardan las fotos, los vídeos y los mensajes de voz

Cada foto, clip de vídeo, grabación de pantalla y mensaje de voz de Agency Pad lo guarda el propio script, a partir de la versión 27.1.1. Tú eliges dónde:

AlmacenamientoConfiguraciónIdeal para
Local (por defecto)Ninguna. Funciona nada más instalarlo.Cualquier servidor. Los archivos se quedan en tu propio servidor, en tu base de datos.
Cloudflare R2Unos 10 minutos, una sola vez. Gratis hasta 10 GB.Servidores con mucho vídeo o con muchísimos jugadores.

Fivemanage y Discord ya no se usan como almacenamiento. Los webhooks de Discord siguen disponibles para los registros.

Almacenamiento local (por defecto)

No hay nada que configurar. El script crea dos tablas en tu base de datos en el primer arranque (agency_media y agency_media_parts) y guarda ahí los archivos. Solo necesitas oxmysql, que el script necesita de todos modos.

Lo que esto significa para ti:

  • Sin cuenta, sin clave de API, sin recursos adicionales. Nada se ejecuta fuera de tu servidor.
  • Las actualizaciones son seguras. Los archivos están en la base de datos, no en la carpeta del recurso, así que al reemplazar la carpeta en una actualización se conservan todas las fotos.
  • Las copias de seguridad de tu base de datos incluyen los medios. La base de datos crece aproximadamente un tercio más que los propios archivos. Una foto ocupa unos 150 KB.
  • Agency Phone y Agency Pad comparten el almacenamiento. Una foto hecha con uno de ellos aparece en el otro, incluidas las fotos sincronizadas con Agency Cloud.
  • La app Agency Companion también los muestra, en iOS, Android y la app web. Tampoco hay que configurar nada para eso.

Velocidad

Los archivos viajan por la propia conexión de FiveM, sin bloquear el juego. FiveM limita la velocidad a la que un jugador puede enviar datos al servidor (unos 165 KB por segundo), por lo que:

QuéGuardarlo tarda aproximadamente
Foto1 segundo
Mensaje de vozmenos de 1 segundo
Clip de vídeo de 15 segundos20 segundos (la cámara muestra el progreso en porcentaje)

Mostrar un archivo a otros jugadores es rápido, un clip entero llega en unos pocos segundos. Si tu servidor graba mucho vídeo, Cloudflare R2 guarda los clips casi al instante.

Ajustes en config.lua

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

    MaxFileMegabytes = 10,             -- archivo individual más grande (clips, grabaciones)
    TransferKilobytesPerSecond = 1000, -- 'local': a qué velocidad se envían los archivos a los jugadores

    Local = {
        RetentionDays = 30,            -- borra los archivos más antiguos que esto (0 = conservar siempre)
        MaxStorageGigabytes = 10,      -- borra los archivos más antiguos por encima de esto (0 = sin límite)
    },
}
AjusteQué hace
RetentionDaysLos archivos más antiguos que este valor se borran automáticamente una vez por hora. Una foto borrada muestra un pequeño marcador de posición en la galería. Pon 0 para conservar todo.
MaxStorageGigabytesCuando todos los archivos juntos superan este tamaño, se borran primero los más antiguos. Pon 0 para no tener límite.
MaxFileMegabytesLos archivos más grandes se rechazan. También limita los clips de vídeo y las grabaciones de pantalla.
TransferKilobytesPerSecondVelocidad por jugador al enviar archivos a los jugadores. El juego siempre tiene prioridad.

Cloudflare R2, paso a paso

Cloudflare R2 es gratis hasta 10 GB de almacenamiento, 1 millón de subidas y 10 millones de descargas al mes, y las descargas nunca cuestan nada. Cloudflare pide un método de pago al activar R2, incluso para el plan gratuito. Solo pagas si superas los límites gratuitos.

1. Activa R2

  1. Inicia sesión en dash.cloudflare.com (basta una cuenta gratuita).
  2. En el menú de la izquierda, abre Storage & databases y después R2 Object Storage.
  3. Añade la suscripción a R2. El resumen muestra $0.00 a pagar ahora. Acepta las condiciones y haz clic en Activate.

2. Crea un bucket

  1. Haz clic en Create bucket.
  2. Ponle un nombre, por ejemplo myserver-media. El nombre no se puede cambiar después.
  3. Deja la ubicación en Automatic y la clase de almacenamiento en Standard.
  4. Haz clic en Create bucket.

3. Haz que los archivos se puedan ver

  1. Abre tu bucket y ve a Settings.
  2. En Public Development URL, haz clic en Enable, escribe allow y confirma.
  3. Copia la dirección que aparece, tiene este aspecto: https://pub-1a2b3c….r2.dev. Esta es tu PublicUrl.

Cloudflare limita la dirección r2.dev para servidores con mucho tráfico. Si tienes un dominio propio en Cloudflare, puedes añadirlo en Custom Domains, en el mismo lugar, y usar esa dirección como PublicUrl en su lugar.

4. Permite las subidas desde el juego

  1. Sigue en Settings, busca CORS Policy y haz clic en Add.
  2. Borra todo lo que haya en el campo de texto, pega esto y haz clic en Save:
[
  {
    "AllowedOrigins": ["https://cfx-nui-agency-phone", "https://cfx-nui-agency-pad"],
    "AllowedMethods": ["PUT", "GET"],
    "AllowedHeaders": ["*"],
    "MaxAgeSeconds": 3600
  }
]

Sin este paso el juego no puede subir archivos y las fotos no se guardan. Si has cambiado el nombre de la carpeta del recurso, pon el nombre de tu carpeta después de cfx-nui-.

5. Crea una clave

  1. Vuelve a R2 Object Storage y haz clic en Manage API tokens.
  2. Haz clic en Create API token (sirve un token de cuenta).
  3. Permisos: Object Read & Write.
  4. En la elección del bucket, selecciona solo tu bucket.
  5. Haz clic en Create. Cloudflare muestra el Access Key ID y el Secret Access Key una sola vez, copia ambos ahora.
  6. Tu Account ID aparece en el resumen de R2 y también es la primera parte de la dirección S3 (https://<Account ID>.r2.cloudflarestorage.com).

6. Introdúcelo en el script

Las claves van en config_server.lua. Este archivo solo lo lee el servidor y nunca se envía a los jugadores. No las pongas en config.lua: ese archivo se envía a todos los jugadores.

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

Después establece el proveedor en config.lua y reinicia el recurso:

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

La consola del servidor ahora muestra Media: storage: Cloudflare R2, bucket myserver-media. Si falta algo, la consola dice qué, y el script sigue guardando en local hasta que lo arregles, así que la cámara nunca deja de funcionar.

¿Usas Agency Phone y Agency Pad a la vez? Ambos pueden usar el mismo bucket y la misma clave, cada uno guarda sus archivos en su propia carpeta.

Comprueba que funciona

Ejecuta esto en la consola del servidor (o como administrador en el juego), con el ID de un jugador que esté conectado:

padmediatest 1

El Agency Pad del jugador guarda una pequeña imagen de prueba, la vuelve a cargar como lo haría cualquier otro jugador, la muestra y reproduce un breve mensaje de voz. La consola responde:

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

Añade big para probar también un clip de vídeo de 6 MB: padmediatest 1 big.

Problemas y soluciones

Lo que vesSolución
could not create the media tables en la consolaoxmysql no se está ejecutando o no puede acceder a la base de datos. Inicia oxmysql antes que agency-pad.
Provider is 'cloudflare', but config_server.lua is missing ...Uno de los cinco valores está vacío, o PublicUrl no empieza por https://. Revisa el paso 6.
Las fotos fallan con Cloudflare HTTP 403La clave no tiene permiso de escritura en este bucket, o el nombre del bucket es incorrecto. Revisa el paso 5.
Las fotos fallan con Failed to fetch en CloudflareFalta la política CORS del paso 4 o tiene otro nombre de recurso.
Las fotos guardadas no se ven en CloudflareLa Public Development URL del paso 3 está desactivada, o PublicUrl apunta a otro bucket.
Un vídeo tarda mucho en guardarseEs normal con el almacenamiento local, consulta Velocidad más arriba. Usa Cloudflare R2 para clips instantáneos.
Las fotos antiguas han desaparecidoRetentionDays las borró. Súbelo o pon 0.

Si vienes de Fivemanage o Discord

No hay nada que migrar. Las fotos guardadas antes conservan sus enlaces antiguos y siguen visibles mientras ese servicio las siga entregando. Todo lo nuevo va al almacenamiento que hayas elegido. Los ajustes antiguos MediaStorageProvider, FiveManageApiUrl, FiveManageApiKey y ScreenshotWebhook se ignoran y puedes borrarlos de tu configuración.

Seguridad

  • Solo los jugadores conectados a tu servidor pueden subir archivos. Cada subida se anuncia primero y se comprueba su tipo y tamaño.
  • El contenido se comprueba por sus primeros bytes. Nunca se puede guardar una página web o un script disfrazado de foto.
  • Los nombres de archivo son aleatorios de 128 bits, no se pueden adivinar ni listar.
  • Las subidas y descargas están limitadas por jugador.
  • Con Cloudflare, cada subida recibe su propio enlace, válido durante 5 minutos, para exactamente un archivo de un tipo y un tamaño. La clave secreta nunca sale de tu servidor.

¿Sigues atascado después de esta página? Nuestro soporte se encarga.