ドキュメントのメニュー

FiveM / RedM

SDK の導入と設定

FiveM / RedM から EdgeWorks を使うためのリソースです。EdgeVault・EdgeStream・EdgeGuard が 1 つの edgeworks リソースに入っています。最新版は 3.7.0 です。
このページの内容

入手

edgeworks 3.7.0

edgeworks-fivem-sdk-3.7.0.zip·25 ファイル·156 KB

このリソースは Cfx の keymaster による asset escrow で保護されています。 入手は無料ですが、Cfx アカウントへの付与 が要るので、購入の途中で FiveM アカウントとの連携をお願いします。

付与を受けていないサーバーで起動すると、コンソールに You lack the required entitlement. と出ます。そのときは、サーバーを動かしている Cfx アカウントと、 入手に使ったアカウントが同じかを確かめてください。

SHA-256: a046b5bbe896867dc259eec973d632ea6d19e8af3b0149d7c595b50e19336fb9※ この値は escrow を掛ける前の中身のものです。Tebex から受け取る物とは一致しません。

はじめて入れる

  1. 1

    edgeworks フォルダを置く

    入手した zip を展開すると edgeworks フォルダが出ます。FiveM サーバーの resources/ の中に置きます。

  2. 2

    API キーを発行する

    ダッシュボードの「設定」→「API キー」で発行します。キーは発行したときに一度だけ表示されるので、その場で控えてください。組織で使うときは、組織を選んでから発行した組織用のキーを使います。

  3. 3

    server.cfg に API キーと ensure を書く

    set で書いた値はサーバーの中だけで使われ、プレイヤーには配られません(setr は配られるので使わないでください)。server.cfg に書かない場合は、config_server.lua の Config.ApiKey に直接書きます。

    server.cfg
    # server.cfg
    set edgeworks_api_key "ダッシュボードで発行した API キー"
    ensure edgeworks
  4. 4

    サーバーの名前を付けて、起動する

    config_server.lua の Config.ServerName を、そのサーバーだけの名前に変えます(既定のままだと起動のたびに警告が出ます)。サーバーを起動(再起動)します。

  5. 5

    つながったかを確かめる

    サーバーのコンソールで edgeworks-status と打つと、「ステータス: 接続中 ✓」と出ます。続けてゲームに入り /screenshot(既定のキーは F9)で撮ると、ダッシュボードの EdgeVault に画像が並びます。

設定ファイル

編集してよいのは config.lua と config_server.lua と locales/ の 3 つです。 ほかのファイルは更新のたび上書きされます。

config.lua に API キーを書かないでください。このファイルは接続した全プレイヤーの端末へ配られるので、書いた値は誰でも読めます。 送り先・API キー・サーバー名・監視用リソースの名前は config_server.lua に書きます。

config.lua — プレイヤーの端末にも配られます
-- config.lua(プレイヤーの端末にも配られます)
Config.Modules = {
    Vault  = true,   -- EdgeVault(スクリーンショットの保管と閲覧)
    Stream = true,   -- EdgeStream(映像の配信)
    Guard  = true,   -- EdgeGuard(不正の検知)
}

Config.MenuCommand = 'edgeworks'   -- /edgeworks で開く
Config.MenuKey     = 'F10'
Config.Locale      = 'ja'          -- 'ja' / 'en'(文言は locales/ にあります)
Config.DebugLevel  = 0             -- 公開サーバーは 0 のまま
config_server.lua — サーバーだけが読みます
-- config_server.lua(サーバーだけが読みます)
Config.ApiBaseUrl = 'https://nozawatec.com/api/edgeworks'   -- ふつうは変えません

-- API キーは server.cfg に書くのがいちばん安全です(下の「はじめて入れる」の 3)
Config.ApiKey = GetConvar('edgeworks_api_key', '')
if Config.ApiKey == '' then
    Config.ApiKey = 'YOUR_API_KEY_HERE'   -- server.cfg に書かない場合は、ここに直接書きます
end

-- 1 台につき 1 つ。同じ名前の 2 台を動かすと記録が互いに上書きされます
Config.ServerName = 'My FiveM Server'

-- プレイヤーごとにフォルダを分ける(既定 true)
-- false にすると、プレイヤーが互いの画像を見られ、消せる状態になります
Config.Vault.PerPlayerFolders = true
Config.Vault.DefaultFolder    = '/screenshots'
Config.Vault.EvidenceFolder   = '/guard-evidence'

送り先の末尾に / を付けても、起動時に自動で外します。

管理者の決めかた

BAN などの管理コマンドや、ほかのプレイヤーの画像の閲覧は、管理者だけが行えます。 SDK は次の順に見て、どれかに当たる人を管理者として扱います。

  1. config_server.lua の Config.Hooks.HasPermission に関数を書いた場合は、その結果だけで決めます
  2. ACE の edgeworks.admin を許可された人
  3. QBCore の admin・god の権限を持つ人
  4. ESX の admin・superadmin グループの人
server.cfg
# server.cfg — ACE で管理者を決める例
add_ace group.admin edgeworks.admin allow
add_principal identifier.license:あなたの license group.admin

使えるコマンド

コマンド使える人すること
/edgeworks(F10)全員EdgeWorks のメニューを開きます
/screenshot(F9)全員画面を撮って EdgeVault に置きます
/stream(F11)全員自分の画面の配信を始める・止める
/guard-status・/guard-detections管理者・コンソールEdgeGuard の設定と疎通、最近の検知を見ます
/guard-ban [ID] [理由] [分]・/guard-unban [識別子]管理者・コンソールBAN と、その解除
edgeworks-statusコンソール(ゲーム内では通知)EdgeWorks に届くかを確かめます
edgeworks-debug [0-3]コンソールコンソールに出す細かさを一時的に変えます
edgeguard-selftestコンソールEdgeGuard の検知に要る前提がそろっているかを診断します

コマンドの名前とキーは config.lua・config_server.lua で変えられます。表は既定の名前です。

サーバーのログを送る

サーバーのログを EdgeWorks に送り、ダッシュボードの EdgeVault の「サーバーのログ」で読めます。既定では送りません。config_server.lua の Config.Logs.Enabled を true にすると送り始めます。

受け付けは 2026-10-29 12:00(日本時間) からです。それより前に有効にすると、断られた旨がコンソールに出て、5 分ずつ送るのを止めます。

config_server.lua
-- config_server.lua
Config.Logs.Enabled         = true     -- 既定は false(送りません)
Config.Logs.CaptureSdkLogs  = true     -- EdgeWorks 自身がコンソールに出す行も送る
Config.Logs.FlushInterval   = 5000     -- まとめて送る間隔(ミリ秒)
Config.Logs.BatchSize       = 100      -- 1 回に送る件数(1〜100)
Config.Logs.QueueMax        = 1000     -- 送れずに待たせておける件数。超えたら古い順に捨てて数えます
Config.Logs.SummaryInterval = 300000   -- 送った・捨てた件数の累計をコンソールに出す間隔(ミリ秒)。0 なら出しません

ほかのリソースからは exports.edgeworks:log(段階, 本文, 付帯情報, 分類) で 1 件ずつ渡せます。段階は error・warn・info・debug のどれかです。積めたら true、積めなかったら false と理由を返します。

ほかのリソースのサーバー側(例)
-- 他のリソースのサーバー側のスクリプトから
local ok, why = exports.edgeworks:log('warn', '所持金が急に増えました', { player = source, amount = 500000 }, 'economy')
if not ok then print('ログを積めませんでした: ' .. tostring(why)) end
  • 送ったログは、EdgeWorks が受け取った時から 30 日で消えます。 ダッシュボードから先に消すこともできます。
  • 本文はそのまま保存されます。プレイヤーの名前や識別子を書いたログは、それも保存されます。書く内容は、送る側で決めてください。
  • 送れるのは、EdgeWorks 自身がコンソールに出す行と、exports.edgeworks:log で渡したものだけです。ほかのリソースの print は送りません。
  • 1 件の本文は 2,000 文字、付帯情報は 2,048 バイトまで。保存できるのは 1 アカウントで 100,000 件まで(個人と組織の合計)です。受け付けられなかった件数と理由は、 サーバーのコンソールに出ます。
  • ダッシュボードの一覧は自動では更新しません。新しいログは読み込み直したときに出ます。

参加するまえのカードと警告

参加するまえのカード

接続してきた相手には、接続画面にカードで確認の進み具合を見せます。並ぶのは BAN の照合と、ダッシュボードの EdgeGuard で決めた参加するまえの確認の 2 つで、それぞれ「確認しています」「問題ありません」「参加できません」のどれかが出ます。

  • 確かめていないことを「問題ありません」とは書きません。問い合わせが失敗したり時間切れになったりして通したときは「確認できませんでした(参加は止めていません)」、BAN の照合を切っているときは「行わない設定です」と出ます。
  • 参加できないときは、理由のカードに替わります。利用停止なら、理由・止めた日時・期限(無期限ならそう書きます)を出します。Config.Guard.AppealUrlを書くと、異議の申し立ての窓口を開くボタンも出ます。
  • プレイヤーの名前と理由は、カードの書式の記号を打ち消してから入れます。名前に書かれたリンクは押せません。

全画面の警告

ダッシュボードから「警告」を出すと、プレイヤーの画面いっぱいに警告が出ます。ゲーム内の通知と違って見落とされず、本人が OK(Enter・コントローラーの A)を押すまで消えません。OK を押せるのは、出てからWarningMinSeconds秒(既定 5 秒)たってからです。押すと、サーバーのコンソールに 1 行残ります。

  • 運営が書いた文は、そのまま出します。
  • EdgeGuard が自動で出した警告は、決まった文だけを出します。何で警告されたか(検知の種類・スコア)は出しません。出すと、どこまでなら処分されないかを測る手がかりになるからです。
  • 画面がまだ読み込まれていない(参加した直後など)ときは、5 秒待ってゲーム内の通知に戻します。操作を奪ったまま何も見えない、ということは起きません。
設定
-- config_server.lua
Config.Guard.ConnectCard     = true    -- 参加するまえの確認をカードで見せる。false なら 1 行の文字
Config.Guard.ConnectCardHold = 1000    -- 終わったカードを見せてから参加させる長さ(ミリ秒)。0〜5000
Config.Guard.DenyCardSeconds = 60      -- 参加できないときのカードを出しておく長さ(秒)
Config.Guard.AppealUrl       = ''      -- 異議の申し立ての窓口。https:// で始まる URL。空なら出しません

-- config.lua
--   WarningScreen     = true          -- 警告を全画面で見せる。false ならゲーム内の通知
--   WarningMinSeconds = 5             -- OK を押せるようになるまでの秒数(0〜60)

導入後に確かめること

この版は構文・設定・イベント・権限の自動検査を通しています。 ゲームサーバー上での通し確認はこれからなので、導入後に次の 3 点をご確認ください。合わない場合はお問い合わせください。

  • ・2 人以上で参加し、ギャラリーに自分のスクリーンショットだけが並ぶこと
  • ・サーバーのコンソールに前提を申告しましたの行が出ること
  • ・参加するときの接続画面に、EdgeGuard の確認のカードが出ること

使うときの注意

  • フォルダはプレイヤーの識別子から作ります。GetPlayerIdentifierが同じ値を返す 2 人は同じフォルダを共有します。標準のlicense:識別子なら一意ですが、フレームワークの設定によって変わります。 導入時に、フォルダが想定どおり分かれているか確かめてください。
  • PerPlayerFolders = falseにすると 2.0.0 と同じ状態に戻ります。共有アルバムを作りたいなど、 意図がある場合だけにしてください。
  • API キー 1 本で、ファイルの一覧と削除・BAN・配信の作成まで行えます。 キーが漏れたと思ったら、ダッシュボードの「設定」→「API キー」ですぐに失効させ、発行し直してください。

2.x から更新する

2.x の SDK は、もう EdgeWorks に届きません

以前の送り先(https://edgeworks.nozawatec.com/api)は 2026 年 10 月 24 日に終了しました。 2.x はすべての要求が失敗するので、最新版へ更新してください。2.0.0 にあった権限の穴 4 件も、更新すると解消します(下に全部書いています)。

穴を塞げるのは SDK 側だけです。API キーはサーバー単位で、プレイヤー単位ではないので、 こちら(サーバー側)で持ち主を判定することはできません。

入れ替えの手順

  1. 1

    リソースを差し替える

    edgeworks フォルダをまるごと新しいものに置き換えます。上書きではなく置き換えてください(外したファイルが残ると古い挙動が混ざります)。

  2. 2

    config を 2 枚に分ける

    設定が config.lua(プレイヤーにも配られる)と config_server.lua(サーバーだけ)に分かれました。API キーと送り先とサーバー名は config_server.lua(または server.cfg)に移してください。古い config.lua だけを置いたままでも起動はしますが、コンソールに赤字で案内が出ます。

  3. 3

    refresh してから ensure edgeworks

    サーバーのコンソールで refresh、続けて ensure edgeworks を実行します。

  4. 4

    サーバーを完全に再起動する

    NUI とクライアントスクリプトが差し替わるので、restart では足りません。スマートフォン系リソース(lb-phone / Quasar Phone など)を併用している場合は、それらも再読み込みしてください。

2.0.0 からの設定の変更点

Config.ApiBaseUrl
https://nozawatec.com/api/edgeworks に変更
Config.Vault.PerPlayerFolders
追加(既定 true)。穴を塞ぐための要
Config.Vault.EvidenceFolder
追加(既定 /guard-evidence)
Config.Vault.PresignedUrlExpiry
削除。送っても API 側が見ていませんでした(常に 1 時間)
Config.Vault.GalleryAutoRefresh
削除。どこからも読まれていませんでした
Config.Stream.NotifyViewers
削除。同上

表から消えた設定は、書いても動作に影響しないことが分かったものです。config から削除してください。

3.0.0 で塞いだ穴

任意のプレイヤーが任意のファイルを消せた

2.0.0 の server/vault.lua は、クライアントから来た file_id を無検査で API へ転送していました。FiveM のサーバーイベントは誰でも好きな引数で呼べるので、連番で叩けばアカウント内の全ファイルを消せました。

全員が全員のスクリーンショットを見られた

SDK は絞り込みのつもりで player_id を送っていましたが、受け側がその値を見ていませんでした。結果として誰でもアカウント内の全ファイルを一覧できました。

任意のプレイヤーが任意の配信を消せた

EdgeStream の delete も同じ形でした。stream_id を無検査で転送していました。

検知ルールを誰でも読めた

EdgeGuard の requestRules だけ管理者の確認が抜けていました。しきい値が読めれば、その下をくぐる設定が読めます。

どう塞いだか

アップロード先をプレイヤーごとのフォルダに分けました。一覧はそのプレイヤーのフォルダだけを引き、 削除は「そのファイルが自分のフォルダに在るか」をサーバーが確かめてから行います。edgeworks.adminを持つ相手は従来どおり全部見られ、消せます。 フォルダは実体のないラベルなので、置き場のディレクトリ構成は変わりません。

2.0.0 で撮ったファイルは /screenshots の直下に在り、新しい版はプレイヤーごとの子フォルダしか引かないので、 旧ファイルは管理者だけが見える状態になります。 各プレイヤーに戻したい場合はダッシュボードから移動させてください。

FiveM SDK の導入と設定 | EdgeWorks