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.
Özetle;
- Başlat Test Şehri (Docker) herhangi bir betiği güvenli bir şekilde izole etmek ve kıyaslamak için.
- Çalıştır Kabul Kontrol Listesi bir kuruş el değiştirmeden önce.
- Kullanın Risk Puanı (0–100) gönderme/bekletme/reddetme kararı vermek için.
- Satıcıları şununla değerlendirin: Satıcı Değerlendirme Tablosu (bunu atlamayın).
- Satın alıyorsanız, güvenilir mağazaları tercih edin — seçtiklerimize bakın: En İyi Tebex Mağazaları.
Bölüm 1 — Güvenli, Tekrarlanabilir Betik QA için “Test Şehri” (Docker)
Ne alırsınız
- Konteynerleştirilmiş FXServer + MariaDB (+ Adminer)
- Temiz sunucu.cfg ile
oxmysqlve temel kaynaklar - Bind-mount ile bağlanmış
resources/customtest edilen betiği bıraktığınız yer - Basit DB dizeleri için deterministik ağ adları/portları
test-city.zip'i indirin (Github)
Nasıl kullanılır:
- Zip'ten çıkar →
cd test-city - Kopyala
.env.exampleile.envve kendi ... ayarlayınLICENSE_KEY(ve isterseniz DB bilgileri). - Düşürmek
oxmysqliçineserver-data/resources/[standalone]/oxmysql/. - Test edilecek betiği şu konuma yerleştirin:
server-data/resources/custom/<scriptname>/ve ekleensure <scriptname>ileserver.cfg. docker compose build && docker compose up -d→ Direct Connect ile bağlanın:localhost:30120.
Ön koşullar: Docker + Docker Compose, bir cfx lisans anahtarı ve bir
oxmysqlkaynak kopyası (şuraya bırakın:server-data/resources/[standalone]/oxmysql).
Klasör düzeni
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 (örnek)
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
Eğer artifact'ınız farklı bir başlatıcı yolu kullanıyorsa, son satırı buna göre ayarlayın (örneğin,
/opt/fivem/alpine/opt/cfx-server/run.sh).
server-data/server.cfg (yalın, test için hazır)
# ---------- 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
Scriptinizi etkinleştirin: şuraya kopyalayın:
server-data/resources/custom/myscript/ve ekleensure myscriptalt bloğa.
Çalıştırın
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
Bölüm 2 — Script Kabul Kontrol Listesi (Atlamayın)
Bunu her seferinde kullanın. Takipçinize kopyalayın ve maddeleri işaretleyin.
A. Ön uçuş (kurulumdan önce)
- Kaynak türü: Açık kaynak / kısmen açık / yalnızca escrow.
- Bağımlılıklar listelenmiş: çerçeve (ESX/QBCore/QBOX),
ox_lib,oxmysql,PolyZone, vesaire. - fxmanifest.lua:
lua54 'yes', doğrugame 'gta5',fx_versioneski değil. - Dokümanlar: kurulum adımları, yapılandırma örnekleri, izinler, yerelleştirmeler, bilinen çakışmalar.
- Lisans/Kullanım Koşulları: kullanım hakları, para iade politikası, güncellemeler, destek kanalı.
B. Kurulabilirlik
- Konsolda hata yok
ensure: sıfır yığın izi veya varlık eksik spamı. - HAYIR
deprecated nativesspam. - Yapılandırma temiz yükleniyor: JSON/Lua sözdizimi hatası yok.
- Veritabanı geçişleri: tabloları bir kez oluştur; yeniden başlatmalar tekrar uygulamaz veya bozmaz.
C. İşlevsellik
- Çekirdek akışlar çalışıyor: mutlu yol test edildi (ör. satın alma, iş akışı, üretim).
- Kenar durumlar: yanlış girdiler, eksik izinler, aralık dışı miktarlar.
- Yerelleştirme: yerelleştirme sözü verildiyse sabit kodlanmış dizeler yok.
- İzinler: personel/yönetici komutları kısıtlı; istemci tarafında ücretsiz erişim yok.
D. Performans (istemci ve sunucu)
resmon: boşta ≤ 0.10ms, aktif ≤ 0.50ms (istemci).- Sunucu tik sağlığı: normal kullanımda uzun duraklama uyarıları yok.
- Veritabanı sorguları: sıkı döngü yok; hazırlanmış ifadeler kullanıldı; minimal N+1.
E. Güvenlik
- Sunucu tarafı doğrulama: her sunucu olayı doğrulanır
source, izinler ve giriş türleri. - İstemcide güven yok: yalnızca sunucu mantığından para/envanter değişiklikleri.
- Eval yok/
loadstring/remote code kalıplar. - Kötüye kullanımı önleme: spam yapan uç noktalarda hız sınırları/kısıtlamalar.
- Escrow bütünlüğü: güvenli olmayan yapılandırma yükleyicilerinde arka kapı yok.
İyi etkinlik deseni (örnek):
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. Uyumluluk ve Temizlik
- Çerçeve adaptörleri mevcut (ESX/QBCore/QBOX) veya açıkça desteklenmediği belirtilen.
- Küresel değişken sızıntısı yok, benzersiz olay adları, kaynak adı varsayımı yok.
- Temiz kaldırma: kaynağı kaldırmak diğerlerini bozmaz.
Bölüm 3 — Nicel Risk Puanlama Modeli (0–100)
“Gönder/beklet/reddet” kararı vermek için kullanın. Düşük daha iyidir.
| Faktör | Ağırlık | Nasıl Puanlanır (0=iyi → 5=kötü) |
|---|---|---|
| Performans | 0.20 | resmon idle: 0=≤0.10ms, 1=≤0.20, 3=≤0.50, 5=>0.50; ani artışlar +1 ekler |
| Güvenlik | 0.25 | 0=tüm sunucu tarafından doğrulanan + hız sınırları; 3=bazı boşluklar; 5=istemciye güvenir / güvensiz olaylar |
| İstikrar | 0.15 | 0=hatasız; 3=ara sıra uyarılar; 5=sık hatalar/takılmalar |
| Uyumluluk | 0.10 | 0=adaptörler/testler; 3=yalnızca bir çerçeve; 5=yaygın bağımlılıkları bozar |
| Bakım Kolaylığı | 0.10 | 0=belgeler/değişiklikler/semantik sürümler; 5=belge yok/terk edilmiş |
| Tedarik Zinciri/Satıcı | 0.20 | 0=saygın, geçmiş, geri ödemeler; 5=bilinmeyen, politika yok |
Formül
RiskScore = 100 * Σ(weight_i * (score_i / 5))
Bantlar ve Eylemler
- 0–24 (Düşük): Staging'e gönder, izle.
- 25–49 (Orta): Canlıya geçmeden önce düzeltilmesi gerekenler.
- 50–74 (Yüksek): Beklet; satıcı yamalarını iste veya değiştir.
- 75–100 (Kritik): Reddet.
Örnek
- Perf=1, Sec=3, Stability=1, Compat=1, Maint=2, Vendor=1
- Risk = 100*(.2*.2 + .25*.6 + .15*.2 + .1*.2 + .1*.4 + .2*.2) = 34 → Orta
Bölüm 4 — Satıcı Değerlendirme Kriterleri (her biri 0-5 arası puanlanır, yüksek daha iyidir) daha iyi)
| Kriter | “İyi” Olan Ne? | Notlar |
|---|---|---|
| Kimlik ve Geçmiş Kaydı | Net marka, aktif yıllar, tutarlı tanıtıcı | Tek kullanımlık mağazalardan kaçının |
| Belgeleme | Kurulum + yapılandırma + izinler + sorun giderme | Ekran görüntüleri/gifler yardımcı olur |
| Güncelleme Sıklığı | Değişiklik Günlüğü, anlamsal sürümler, son taahhütler/sürümler | Üç ayda bir+ yeterlidir |
| Destek Kalitesi | Bilet/Discord SLA'lar, tekrarlanabilir düzeltmeler, sadece “yeniden başlat” değil” | Örnek yanıtlar |
| Sorun Şeffaflığı | Halka açık bilinen sorunlar ve yol haritası | Dürüstlük > mükemmellik |
| Geri Ödeme/Kullanım Koşulları Netliği | İade süresi, koşulları, lisans koşulları | Karanlık desen yok |
| Test Kanıtı | Hazırlık videosu, performans metrikleri, çerçeve listesi | Daha da iyisi: demo sunucu |
| Güvenlik Hijyeni | Sunucu tarafı kontrollerden, hassas anahtarlardan, eval'den bahseder | Denetimler hakkında sor |
| Uyumluluk Politikası | ESX/QBCore/QBOX belirtildi, adaptörler, sürüm matrisi | Desteklenen yapılar durumu |
| Fiyatlandırma ve Değer | Karmaşıklık için adil, bağımlılık ödeme duvarı yok | Ek satış tuzaklarına dikkat edin |
Kriter Puanı (0-50):
- 40–50: Güçlü — tercih edilen satıcı
- 30–39: Kabul edilebilir — izle
- 20–29: Zayıf — dikkatli ilerleyin
- <20: Kaçının
Profesyonel İpucu: Saygın pazarlarla çapraz referans yapın. Buradan başlayın: En İyi Tebex Mağazaları.
Bölüm 5 — Bakım Kılavuzu (Gönderdikten Sonra)
- Sürüm sabitleme: kilit betik sürümleri + bağımlılık sürümleri (örneğin,
oxmysql,ox_lib). - Önce staging: tüm güncellemeler şuraya gelir Test Şehri; kabul kontrol listesini tekrar çalıştır.
- Yedeklemeler ve geri alma: Her güncellemeden önce DB anlık görüntüsü + kaynak dosyaları. Bir Rollback.md tam adımlarla.
- CI duman testi (isteğe bağlı, önerilir): başsız istemci bağlantısı + ana akışları vurmak için komut makrosu; sunucu konsolunu hatalar için ayrıştırın.
- Operasyonel metrikler: her betik için basit bir defter tutun: ortalama resmon (boşta/aktif), oturum başına hata sayısı, olay notları.
- Değişiklik günlüğü disiplini: satıcı değişiklik günlükleri isteyin; kendi entegrasyon notlarınızı tutun.
- Zamanlanmış etkinliklerin riskini azaltın: Yoğun saatler dışında güncelleyin; bakım pencerelerini duyurun.
Bölüm 6 — Kopyalayabileceğiniz Şablonlar
A. Test Planı (betik başına)
# 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 (iskelet)
# 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. Sorun Şablonu
**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.
Bu Kılavuzu Etkin Bir Şekilde Kullanma
- Bootstrap Test Şehri bir kez, temiz tutun.
- Her aday betik için:
- İçine bırak
resources/custom/, şurada etkinleştirserver.cfg. - Çalıştır Kabul Kontrol Listesi.
- Hesapla Risk Puanı.
- Satıcıyı şununla doğrulayın: Satıcı Değerlendirme Tablosu.
- İçine bırak
- Geçerse, staging'e birleştirin; geçmezse, düzeltmeler isteyin veya vazgeçin.
Daha fazla test kılavuzuna mı ihtiyacınız var? Learn how to measure script performance with Resmon in FiveM, fix sunucu iş parçacığı tıkanıklığı uyarıları, 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.
