Come valutare, testare e gestire gli script FiveM

How to Evaluate and Test FiveM Scripts Before You Buy

Before you buy or install a FiveM script, test it like a QA lead: run it in an isolated Docker “Test City”, work through the acceptance checklist, score the risk from 0-100, and vet the vendor before money changes hands. This guide gives server owners and developers the full workflow — a copy-paste FXServer + MariaDB docker compose stack, resmon performance limits, security checks, and a maintenance playbook for after you ship.

In breve

  • Girare su Città di prova (Docker) per isolare e fare benchmark di qualsiasi script in modo sicuro.
  • Esegui il Lista di controllo per l'accettazione prima che un centesimo cambi di mano.
  • Utilizzare il Punteggio di rischio (0–100) per decidere se spedire/trattenere/respingere.
  • Venditori veterinari con il Rubrica del fornitore (non saltare questo passaggio).
  • Se decidi di acquistare, preferisci i negozi affidabili: dai un'occhiata alla nostra selezione: I migliori negozi Tebex.

Parte 1 — “Test City” (Docker) per un QA degli script sicuro e ripetibile

Cosa ottieni

  • FXServer containerizzato + MariaDB (+ amministratore)
  • Pulito server.cfg con oxmysql e risorse di base
  • Montato su legatura resources/custom dove si rilascia lo script in fase di test
  • Nomi/porte di rete deterministici per stringhe DB semplici

Scarica test-city.zip (Github)

Come si usa:

  1. Decomprimi → cd test-city
  2. Copia .env.example A .env e imposta il tuo LICENSE_KEY (e credenziali DB, se preferisci).
  3. Gocciolare oxmysql in server-data/resources/[standalone]/oxmysql/.
  4. Metti lo script in prova in server-data/resources/custom/<scriptname>/ e aggiungere ensure <scriptname> A server.cfg.
  5. docker compose build && docker compose up -d → connettiti tramite Direct Connect a localhost:30120.

Prerequisiti: Docker + Docker Compose, una chiave di licenza cfx e un oxmysql copia della risorsa (rilasciare in server-data/resources/[standalone]/oxmysql).

Disposizione delle cartelle

test-city/
├─ docker-compose.yml
├─ fxserver/
│ ├─ Dockerfile
│ └─ entrypoint.sh
├─ server-data/
│ ├─ server.cfg
│ └─ resources/
│ ├─ [standalone]/oxmysql/ # place oxmysql here
│ └─ custom/ # put the script under test here (e.g., myscript/)
└─ .env

.env (esempio)

LICENSE_KEY=changeme_cfx_license_key
MYSQL_DATABASE=fivem
MYSQL_USER=fivem
MYSQL_PASSWORD=fivempw
MYSQL_ROOT_PASSWORD=rootpw
FX_ARTIFACT_URL=https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/LATEST.tar.xz
# Tip: replace with a specific artifact URL you trust for reproducibility.

docker-compose.yml

version: "3.9"

networks:
 testcity:

volumes:
 db_data:

services:
 db:
 image: mariadb:10.11
 restart: unless-stopped
 environment:
 MYSQL_DATABASE: ${MYSQL_DATABASE}
 MYSQL_USER: ${MYSQL_USER}
 MYSQL_PASSWORD: ${MYSQL_PASSWORD}
 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
 command: >
 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 --innodb_buffer_pool_size=256M
 volumes:
 - db_data:/var/lib/mysql
 networks: [testcity]

 adminer:
 image: adminer:4
 restart: unless-stopped
 ports:
 - "8080:8080"
 networks: [testcity]
 depends_on: [db]

 fxserver:
 build:
 context: ./fxserver
 args:
 FX_ARTIFACT_URL: ${FX_ARTIFACT_URL}
 restart: unless-stopped
 environment:
 LICENSE_KEY: ${LICENSE_KEY}
 MYSQL_DATABASE: ${MYSQL_DATABASE}
 MYSQL_USER: ${MYSQL_USER}
 MYSQL_PASSWORD: ${MYSQL_PASSWORD}
 depends_on: [db]
 networks: [testcity]
 ports:
 - "30120:30120/udp"
 - "30120:30120/tcp"
 - "40120:40120/tcp" # txAdmin (optional)
 volumes:
 - ./server-data:/opt/fivem/server-data

fxserver/Dockerfile

FROM debian:bookworm-slim

ARG FX_ARTIFACT_URL
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y --no-install-recommends 
 xz-utils curl ca-certificates tini bash && 
 rm -rf /var/lib/apt/lists/*

# Fetch & extract FXServer artifact (URL provided via build-arg)
RUN mkdir -p /opt/fivem && 
 curl -fsSL "$FX_ARTIFACT_URL" -o /opt/fivem/fx.tar.xz && 
 tar -xJf /opt/fivem/fx.tar.xz -C /opt/fivem && 
 rm -f /opt/fivem/fx.tar.xz

# Non-root
RUN useradd -ms /bin/bash fivem
USER fivem

WORKDIR /opt/fivem
COPY --chown=fivem:fivem ../server-data /opt/fivem/server-data
COPY --chown=fivem:fivem entrypoint.sh /entrypoint.sh

ENTRYPOINT ["/usr/bin/tini","--"]
CMD ["/bin/bash","/entrypoint.sh"]

fxserver/entrypoint.sh

#!/usr/bin/env bash
set -euo pipefail

# Provide DB string for oxmysql via server.cfg (already set there),
# just ensure the DB is reachable before boot to avoid spam errors.
echo "Waiting for database..."
until nc -z db 3306; do sleep 1; done
echo "DB ready."

# Run FXServer with our server.cfg
# Most Linux artifacts ship a run.sh in the artifact root.
exec bash /opt/fivem/run.sh +exec /opt/fivem/server-data/server.cfg

Se il tuo artefatto utilizza un percorso di avvio diverso, modifica di conseguenza l'ultima riga (ad esempio, /opt/fivem/alpine/opt/cfx-server/run.sh).

server-data/server.cfg (snello, pronto per i test)

# ---------- Identity ----------
sv_licenseKey "%LICENSE_KEY%" # injected by env in entrypoint command or replace manually
sv_hostname "Test City — Script QA"
sets tags "qa,testing,fivemx"
sv_maxclients 2
onesync on
sv_scriptHookAllowed 0
sv_enforceGameBuild 3095

# ---------- Networking ----------
endpoint_add_tcp "0.0.0.0:30120"
endpoint_add_udp "0.0.0.0:30120"

# ---------- Database (oxmysql) ----------
set mysql_connection_string "mysql://%MYSQL_USER%:%MYSQL_PASSWORD%@db:3306/%MYSQL_DATABASE%?charset=utf8mb4"

# ---------- Core / Base resources ----------
ensure mapmanager
ensure chat
ensure spawnmanager
ensure sessionmanager
ensure hardcap
ensure baseevents

# ---------- Datastore ----------
ensure oxmysql

# ---------- Under test ----------
# Drop your script folder into resources/custom/<scriptname> and enable here:
# ensure myscript

# ---------- QA helpers ----------
# Verbose logging in dev
setr con_minSeverity info

# Enable txAdmin panel (optional)
setr txAdminPort 40120

Abilita il tuo script: copiarlo in server-data/resources/custom/myscript/ e aggiungere ensure myscript al blocco inferiore.

Eseguilo

cd test-city
docker compose build
docker compose up -d
# Adminer at http://localhost:8080 (server: db, user: fivem, pass: fivempw)
# Connect FiveM client → Direct Connect: your-docker-host:30120

Parte 2 — Lista di controllo per l'accettazione dello script (da non saltare)

Usalo ogni volta. Copialo nel tuo tracker e spunta gli elementi.

A. Pre-volo (prima dell'installazione)

  • Tipo di fonte: Open source / parzialmente aperto / solo deposito a garanzia.
  • Dipendenze elencate: framework (ESX/QBCore/QBOX), ox_lib, oxmysql, PolyZone, ecc.
  • fxmanifest.lua: lua54 'yes', corretto game 'gta5', fx_version non antico.
  • Documenti: passaggi di installazione, esempi di configurazione, permessi, impostazioni locali, conflitti noti.
  • Licenza/Termini di servizio: diritti di utilizzo, politica di rimborso, aggiornamenti, canale di supporto.

B. Installabilità

  • Nessun errore della console attivo ensure: zero stack trace o spam di risorse mancanti.
  • NO deprecated natives spam.
  • La configurazione viene caricata pulita: nessun errore di sintassi JSON/Lua.
  • Migrazioni DB: crea le tabelle una volta sola; i riavvii non vengono riapplicati né interrotti.

C. Funzionale

  • Nucleo i flussi funzionano: percorso felice testato (ad esempio, acquisto, flusso di lavoro, creazione).
  • Casi limite: input errati, permessi mancanti, quantità fuori intervallo.
  • Localizzazione: nessuna stringa hard-coded se le impostazioni locali sono state promesse.
  • Permessi: comandi staff/admin limitati; nessun accesso libero lato client.

D. Prestazioni (client e server)

E. Sicurezza

  • Convalida lato server: ogni evento del server convalida source, permessi e tipi di input.
  • Nessuna fiducia nel cliente: le modifiche di denaro/inventario dipendono solo dalla logica del server.
  • Nessuna valutazione/loadstring/codice remoto modelli.
  • Anti-abuso: limiti di velocità/restrizioni sugli endpoint spam.
  • Integrità del deposito a garanzia: nessuna backdoor nei caricatori di configurazione non escrow.

Buon modello di evento (esempio):

RegisterNetEvent('myscript:buy', function(item, amount)
 local src = source
 if type(item) ~= 'string' or type(amount) ~= 'number' or amount < 1 then return end
 if not HasPermission(src, 'shop.buy') then return end
 local xPlayer = GetPlayer(src) -- framework adapter
 if not xPlayer then return end
 -- validate price server-side, check inventory limits, do DB in a transaction
end)

F. Compatibilità e pulizia

  • Adattatori Framework presenti (ESX/QBCore/QBOX) o chiaramente dichiarati non supportati.
  • Nessuna perdita globale, nomi di eventi univoci, nessuna ipotesi sul nome della risorsa.
  • Disinstalla pulito: la rimozione della risorsa non danneggia le altre.

Parte 3 — Modello di punteggio del rischio quantitativo (0–100)

Usalo per decidere "spedire/trattenere/rifiutare". Più basso è, meglio è.

FattorePesoCome assegnare un punteggio (0=buono → 5=cattivo)
Prestazione0.20resmon inattivo: 0=≤0.10ms, 1=≤0.20, 3=≤0.50, 5=>0.50; i picchi aggiungono +1
Sicurezza0.250=tutto convalidato dal server + limiti di velocità; 3=alcune lacune; 5=si fida del client/eventi non sicuri
Stabilità0.150=nessun errore; 3=avvisi occasionali; 5=errori/inconvenienti frequenti
Compatibilità0.100=adattatori/test; 3=solo un framework; 5=interrompe le dipendenze comuni
Manutenibilità0.100=documentazione/registro delle modifiche/versioni semantiche; 5=nessuna documentazione/abbandonato
Catena di fornitura/Fornitore0.200=reputabile, storico, rimborsi; 5=sconosciuto, nessuna politica

Formula

RiskScore = 100 * Σ(weight_i * (score_i / 5))

Bande e azioni

  • 0–24 (Basso): Spedire al punto di raccolta, monitorare.
  • 25–49 (moderato): Correzioni necessarie prima della pubblicazione.
  • 50–74 (Alto): Sospendi; richiedi patch del fornitore o sostituisci.
  • 75–100 (Critico): Rifiutare.

Esempio

  • Perf=1, Sec=3, Stabilità=1, Compat=1, Manut=2, Fornitore=1
  • Rischio = 100*(.2*.2 + .25*.6 + .15*.2 + .1*.2 + .1*.4 + .2*.2) = 34 → Moderato

Parte 4 — Rubrica di verifica del fornitore (punteggio da 0 a 5, più alto è Meglio)

CriterioChe aspetto ha il “buono”Note
Identità e precedenti penaliMarchio chiaro, anni di attività, gestione coerenteEvitare i negozi di bruciatori
DocumentazioneInstallazione + configurazione + permessi + risoluzione dei problemiAiuto per screenshot/gif
Aggiorna CadenceChangelog, versioni semantiche, commit/release recentiQuarterly+ va bene
Supporto di qualitàSLA per ticket/Discord, correzioni riproducibili, non solo "riavvio"Esempi di risposte
Trasparenza delle questioniProblemi noti pubblici e roadmapOnestà > perfezione
Chiarezza sui rimborsi/Termini di servizioFinestra di rimborso, condizioni, termini di licenzaNessun modello oscuro
Prova di provaVideo di staging, metriche di prestazione, elenco frameworkAncora meglio: server demo
Igiene della sicurezzaMenziona controlli lato server, nessuna chiave sensibile, nessuna valutazioneRichiedi informazioni sugli audit
Politica di compatibilitàESX/QBCore/QBOX dichiarati, adattatori, matrice delle versioniBuild supportate dallo Stato
Prezzi e valoreGiusto per la complessità, nessun paywall di dipendenzaFai attenzione alle trappole dell'upsell

Punteggio della rubrica (0–50):

  • 40–50: Forte — fornitore preferito
  • 30–39: Accettabile — monitor
  • 20–29: Debole — procedere con cautela
  • <20: Evitare

Consiglio da professionista: Fai un confronto con marketplace affidabili. Inizia qui: I migliori negozi Tebex.


Parte 5 — Manuale di manutenzione (dopo la spedizione)

  1. Versione pinning: versioni di script di blocco + versioni di dipendenza (ad esempio, oxmysql, ox_lib).
  2. Prima messa in scena: tutti gli aggiornamenti atterrano in Città di prova; eseguire nuovamente la checklist di accettazione.
  3. Backup e rollback: Snapshot del DB + file di risorse prima di ogni aggiornamento. Conservare un Rollback.md con passaggi esatti.
  4. Test del fumo CI (facoltativo, consigliato): connessione client headless + macro di comando per raggiungere i flussi principali; analizzare la console del server per individuare eventuali errori.
  5. Metriche operative: tenere un registro semplice per ogni script: resoconto medio (inattivo/attivo), conteggio degli errori/sessione, note sugli incidenti.
  6. Disciplina del registro delle modifiche: richiedere i registri delle modifiche del fornitore; mantenere le proprie note di integrazione.
  7. Ridurre i rischi degli eventi programmati: aggiornamenti al di fuori delle ore di punta; annuncia finestre di manutenzione.

Parte 6 — Modelli che puoi copiare

A. Piano di test (per script)

# Script Test Plan — <name> <version>

## Context
Framework(s): ESX/QBCore/QBOX
Dependencies: oxmysql vX, ox_lib vY, PolyZone vZ
DB Migrations: yes/no
Escrow: yes/no

## Functional Cases
- [ ] Case 1:
- [ ] Case 2:
- [ ] Negative 1:

## Performance
resmon idle: ____ ms
resmon active: ____ ms (scenario: ______)

## Security Checks
- [ ] All server events validate source/perm/input
- [ ] Rate limits present
- [ ] No client-trusted money/inventory mutations

## Logs & Errors
Paste snippet (server + F8): 

## Result
Pass/Fail + Notes

B. Rollback.md (scheletro)

# Rollback — <date> <script> <from→to>

1) Disable script: `stop <resource>`
2) Restore resource files from backup: <path>
3) Restore DB snapshot: <path/command>
4) Restart FXServer
5) Verify: console clean, perf normal, flows ok

C. Modello di problema

**Summary**
What happened vs expected, with timestamps.

**Repro Steps**
1) ...
2) ...

**Env**
Artifact build:
Framework & versions:
Script version:
Other deps:

**Logs**
Server console:
F8:

**Attachments**
Screens/video if possible.

Come utilizzare questa guida in modo efficiente

  1. Bootstrap Test City una volta, tienilo pulito.
  2. Per ogni copione candidato:
    • Lasciati cadere resources/custom/, abilitare in server.cfg.
    • Esegui il Lista di controllo per l'accettazione.
    • Calcola il Punteggio di rischio.
    • Controlla il venditore con il Rubrica del fornitore.
  3. Se il problema viene superato, unisciti alla fase di staging; in caso contrario, richiedi delle correzioni o abbandona il progetto.

Hai bisogno di altre guide sui test? Learn how to measure script performance with Resmon in FiveM, fix avvisi di problemi di thread del server, and build the Part 1 test server with Docker for FiveM.

After the test workflow is ready, compare the exact framework, dependencies, delivered files and setup notes in the FiveM scripts marketplace.