$ USD
  • $ USD
  • € EUR
  • Britse pond (£ GBP)
  • $ AUD
  • R$ BRL
  • CHF CHF
  • ¥ JPY
Hoe FiveM Scripts te evalueren, testen en onderhouden

Hoe je FiveM Scripts Evalueert en Test Voordat je Koopt

Voordat je een FiveM script koopt of installeert, test je het als een QA-lead: draai het in een geïsoleerde Docker “Test City”, doorloop de acceptatiechecklist, scoor het risico van 0-100, en controleer de verkoper voordat er geld wordt uitgewisseld. Deze gids geeft server-eigenaren en ontwikkelaars de volledige workflow — een copy-paste FXServer + MariaDB docker compose stack, resmon prestatielimieten, beveiligingscontroles, en een onderhoudshandboek voor na de lancering.

TL;DR

  • Opstarten Teststad (Docker) om elk script veilig te isoleren en te benchmarken.
  • Voer de Acceptatielijst voordat er een cent van eigenaar wisselt.
  • Gebruik de Risicoscore (0–100) om te beslissen verzenden/houden/afwijzen.
  • Controleer verkopers met de Leveranciersrubriek (sla dit niet over).
  • Als je koopt, geef dan de voorkeur aan gerenommeerde winkels — zie onze keuzes: Beste Tebex Winkels.

Deel 1 — “Teststad” (Docker) voor veilige, herhaalbare scriptkwaliteitscontrole

Wat je krijgt

  • Gecontaineriseerde FXServer + MariaDB (+ Adminer)
  • Schoon server.cfg met oxmysql en basisbronnen
  • Bind-gemonteerd resources/custom waar je het te testen script plaatst
  • Deterministische netwerknamen/poorten voor eenvoudige DB-strings

Download test-city.zip (Github)

Hoe te gebruiken:

  1. Uitpakken → cd test-city
  2. Kopiëren .env.example naar .env en stel je in LICENSE_KEY (en DB-gegevens als je wilt).
  3. Plaats oxmysql in server-data/resources/[standalone]/oxmysql/.
  4. Plaats het te testen script in server-data/resources/custom/<scriptname>/ en voeg toe ensure <scriptname> naar server.cfg.
  5. docker compose build && docker compose up -d → verbind via Direct Connect met localhost:30120.

Vereisten: Docker + Docker Compose, een cfx-licentiesleutel en een oxmysql resource kopie (plaats in server-data/resources/[standalone]/oxmysql).

Mapindeling

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 (voorbeeld)

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

Als je artifact een ander launcher-pad gebruikt, pas dan de laatste regel aan (bijv., /opt/fivem/alpine/opt/cfx-server/run.sh).

server-data/server.cfg (lean, test-klaar)

# ---------- 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

Schakel je script in: kopieer het naar server-data/resources/custom/myscript/ en voeg toe ensure myscript naar het onderste blok.

Voer het uit

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

Deel 2 — Scriptacceptatiecontrolelijst (Niet Overslaan)

Gebruik dit elke keer. Kopieer naar je tracker en vink items af.

A. Pre-flight (vóór installatie)

  • Brontype: Open source / gedeeltelijk open / escrow-only.
  • Afhankelijkheden vermeld: framework (ESX/QBCore/QBOX), ox_lib, oxmysql, PolyZone, enz. toe.
  • fxmanifest.lua: lua54 'yes', correct game 'gta5', fx_version niet oud.
  • Docs: installatiestappen, configuratievoorbeelden, machtigingen, lokalisaties, bekende conflicten.
  • Licentie\/Algemene voorwaarden: gebruiksrechten, restitutiebeleid, updates, ondersteuningskanaal.

B. Installeerbaarheid

  • Geen consolefouten bij ensure: nul stacktraces of 'asset missing' spam.
  • Nee deprecated natives spam.
  • Config laadt schoon: geen JSON\/Lua syntaxfouten.
  • DB-migraties: tabellen eenmalig aanmaken; herstarts passen niet opnieuw toe of breken niet.

C. Functioneel

  • Core flows werken: happy path getest (bijv. aankoop, job flow, crafting).
  • Randgevallen: verkeerde invoer, ontbrekende perms, hoeveelheden buiten bereik.
  • Lokalisatie: geen hard-coded strings als lokalisaties zijn beloofd.
  • Machtigingen: staff\/admin commando's afgeschermd; geen vrije toegang client-side.

D. Prestaties (client & server)

E. Beveiliging

  • Server-side validatie: elke server event valideert source, permissies en invoertypen.
  • Geen vertrouwen in client: geld/inventaris veranderingen alleen vanuit serverlogica.
  • Geen eval/loadstring/remote code patronen.
  • Anti-misbruik: rate limits/throttles op spammy endpoints.
  • Escrow-integriteit: geen backdoors in niet-versleutelde configuratieladers.

Goed event patroon (voorbeeld):

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. Compatibiliteit & Netheid

  • Framework adapters aanwezig (ESX/QBCore/QBOX) of duidelijk niet ondersteund verklaard.
  • Geen globals lekkage, unieke gebeurtenisnamen, geen aannames over resourcenaam.
  • Opschonen bij verwijderen: het verwijderen van de resource breekt anderen niet.

Deel 3 — Kwantitatief Risicoscoresysteem (0–100)

Gebruik dit om te beslissen “verzenden/vasthouden/afwijzen”. Lager is beter.

FactorGewichtHoe te scoren (0=goed → 5=slecht)
Prestaties0.20resmon idle: 0=≤0.10ms, 1=≤0.20, 3=≤0.50, 5=>0.50; spikes voegen +1 toe
Beveiliging0.250=alle server-geverifieerde + snelheidslimieten; 3=enkele hiaten; 5=vertrouwt client / onveilige gebeurtenissen
Stabiliteit0.150=geen fouten; 3=af en toe waarschuwingen; 5=frequente fouten/haperingen
Compatibiliteit0.100=adapters/tests; 3=slechts één framework; 5=breekt veelvoorkomende afhankelijkheden
Onderhoudbaarheid0.100=docs/changelog/semantische versies; 5=geen docs/verlaten
Toeleveringsketen/Leverancier0.200=gerenommeerd, geschiedenis, terugbetalingen; 5=onbekend, geen beleid

Formule

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

Bands & Acties

  • 0–24 (Laag): Verzenden naar staging, monitoren.
  • 25–49 (Gemiddeld): Reparaties vereist voor livegang.
  • 50–74 (Hoog): Vasthouden; leverancierspatches aanvragen of vervangen.
  • 75–100 (Kritiek): Afwijzen.

Voorbeeld

  • Perf=1, Sec=3, Stability=1, Compat=1, Maint=2, Vendor=1
  • Risico = 100*(.2*.2 + .25*.6 + .15*.2 + .1*.2 + .1*.4 + .2*.2) = 34 → Gemiddeld

Deel 4 — Leveranciersbeoordelingsrubriek (beoordeel elk 0-5, hoger is beter)

CriterionWat “goed” eruitzietNotities
Identiteit & Track RecordDuidelijk merk, actieve jaren, consistente gebruikersnaamVermijd wegwerp winkels
DocumentatieInstallatie + configuratie + permissies + probleemoplossingScreenshots/gifs helpen
Update CadansWijzigingslogboek, semantische versies, recente commits/releasesPer kwartaal+ is prima
Kwaliteit van ondersteuningTicket/Discord SLA's, reproduceerbare fixes, niet alleen “herstarten”Voorbeeld reacties
Transparantie van problemenPublieke bekende problemen & roadmapEerlijkheid > perfectie
Duidelijkheid over restitutie/algemene voorwaardenRestitutieperiode, voorwaarden, licentievoorwaardenGeen donkere patronen
TestbewijsStaging video, prestatie metrics, framework lijstNog beter: demo server
BeveiligingshygiëneVermeldt server-side controles, geen gevoelige sleutels, geen evalVraag naar audits
CompatibiliteitsbeleidESX/QBCore/QBOX vermeld, adapters, versie matrixOndersteunde builds van de staat
Prijsstelling & WaardeEerlijk voor complexiteit, geen betaalmuren voor afhankelijkhedenPas op voor upsell-vallen

Rubriekscore (0–50):

  • 40–50: Sterk — voorkeursleverancier
  • 30–39: Acceptabel — controleren
  • 20–29: Zwak — ga voorzichtig te werk
  • <20: Vermijd

Pro tip: Kruisverwijzing met gerenommeerde marktplaatsen. Begin hier: Beste Tebex Winkels.


Deel 5 — Onderhoudshandboek (Nadat u hebt verzonden)

  1. Versie vastzetten: vergrendel script releases + afhankelijkheidsversies (bijv., oxmysql, ox_lib).
  2. Eerst staging: alle updates komen binnen Teststad; voer de acceptatiechecklist opnieuw uit.
  3. Back-ups en rollback: DB snapshot + resourcebestanden vóór elke update. Bewaar een Rollback.md met exacte stappen.
  4. CI smoke test (optioneel, aanbevolen): headless client connect + commandomacro om de belangrijkste flows te raken; serverconsole parsen op fouten.
  5. Operationele statistieken: houd een eenvoudig logboek per script bij: gemiddelde resmon (idle/actief), fouten per sessie, incidentnotities.
  6. Changelog discipline: vereis leverancierswijzigingslogboeken; onderhoud je eigen integratie-aantekeningen.
  7. Risico's van geplande gebeurtenissen verminderen: update buiten piekuren; kondig onderhoudsvensters aan.

Deel 6 — Sjablonen Die U Kunt Kopiëren

A. Testplan (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 (skelet)

# 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. Sjabloon voor problemen

**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.

Hoe u deze gids efficiënt kunt gebruiken

  1. Bootstrap Test Stad één keer, houd het schoon.
  2. Voor elk kandidaatscript:
    • Plaats in resources/custom/, inschakelen in server.cfg.
    • Voer de Acceptatielijst.
    • Bereken de Risicoscore.
    • Vet de verkoper met de Leveranciersrubriek.
  3. Als het slaagt, merge naar staging; zo niet, vraag om fixes of geef het op.

Meer testgidsen nodig? Leer hoe je scriptprestaties meet met Resmon in FiveM, fix server thread hitch warnings, en bouw de Part 1 testserver met Docker voor FiveM.

Nadat de testworkflow klaar is, vergelijk je het exacte framework, de afhankelijkheden, de geleverde bestanden en de installatie-opmerkingen in de FiveM scripts marktplaats.