ドキュメントのメニュー
FiveM / RedM
SDK の導入と設定
入手
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
edgeworks フォルダを置く
入手した zip を展開すると edgeworks フォルダが出ます。FiveM サーバーの resources/ の中に置きます。
- 2
API キーを発行する
ダッシュボードの「設定」→「API キー」で発行します。キーは発行したときに一度だけ表示されるので、その場で控えてください。組織で使うときは、組織を選んでから発行した組織用のキーを使います。
- 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
サーバーの名前を付けて、起動する
config_server.lua の Config.ServerName を、そのサーバーだけの名前に変えます(既定のままだと起動のたびに警告が出ます)。サーバーを起動(再起動)します。
- 5
つながったかを確かめる
サーバーのコンソールで edgeworks-status と打つと、「ステータス: 接続中 ✓」と出ます。続けてゲームに入り /screenshot(既定のキーは F9)で撮ると、ダッシュボードの EdgeVault に画像が並びます。
設定ファイル
編集してよいのは config.lua と config_server.lua と locales/ の 3 つです。 ほかのファイルは更新のたび上書きされます。
config.lua に API キーを書かないでください。このファイルは接続した全プレイヤーの端末へ配られるので、書いた値は誰でも読めます。 送り先・API キー・サーバー名・監視用リソースの名前は config_server.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.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 は次の順に見て、どれかに当たる人を管理者として扱います。
- config_server.lua の
Config.Hooks.HasPermissionに関数を書いた場合は、その結果だけで決めます - ACE の
edgeworks.adminを許可された人 - QBCore の admin・god の権限を持つ人
- ESX の admin・superadmin グループの人
# 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.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
リソースを差し替える
edgeworks フォルダをまるごと新しいものに置き換えます。上書きではなく置き換えてください(外したファイルが残ると古い挙動が混ざります)。
- 2
config を 2 枚に分ける
設定が config.lua(プレイヤーにも配られる)と config_server.lua(サーバーだけ)に分かれました。API キーと送り先とサーバー名は config_server.lua(または server.cfg)に移してください。古い config.lua だけを置いたままでも起動はしますが、コンソールに赤字で案内が出ます。
- 3
refresh してから ensure edgeworks
サーバーのコンソールで refresh、続けて ensure edgeworks を実行します。
- 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 の直下に在り、新しい版はプレイヤーごとの子フォルダしか引かないので、 旧ファイルは管理者だけが見える状態になります。 各プレイヤーに戻したい場合はダッシュボードから移動させてください。