すべてのページ
このページの内容

config.json

config.json はリレー自身の設定ファイルです。ポート、リレーに接続できる範囲、アクセストークン、ターンが停滞したとみなされるタイミングを決めるタイマー、任意のトンネルとプレビューレーンを保持します。作成するのは oar setup です。セットアップが尋ねない項目は、すべて手で編集します。

Web UI で設定するもののほとんどは、このファイルにはありません。Web UI と環境での設定を参照してください。

ファイルの場所 #

インストール パス
macOS、Linux、WSL でのグローバルインストール ~/.oar/config.json
Windows でのグローバルインストール %APPDATA%\oar\config.json
OAR_STATE_ROOT を設定したグローバルインストール そのフォルダーの config.json
git チェックアウト チェックアウト内の server/config.json

OAR_STATE_ROOT は、グローバルインストールの状態フォルダー全体(設定ファイル、データ、ログ)を移動します。OAR がファイルを置く場所を参照してください。

COPILOT_WEB_RELAY_CONFIG は、場所に関係なくリレーを 1 つのファイルに向けます。ただし、oar 自身のランチャーを使わずにリレーを起動した場合に限ります。つまり node server/server.js、または(ファイルが存在する場合の)oar copilot です。oar setup、oar start、oar restart とサービスは、この変数の値にかかわらず、常にインストール自身の config.json を使います。server/config.json がないチェックアウトでは、oar copilot は代わりに ~/.config/copilot-remote(Windows では %LOCALAPPDATA%\copilot-remote)にファイルを作ります。環境変数を参照してください。

ファイルにはアクセストークンが平文で入っているため、リレーはファイルをオーナーだけが読める状態に保ちます(macOS と Linux ではモード 0600)。ファイルのコピーはパスワードと同じように扱ってください。

書き込むもの #

  • oar setup はトークン、localhostOnly、port を書き込み、ほかのキーはすべて見つけたとおりに残します。作成したファイルや、これらのキーがないファイルには、pollIntervalMs、processingTimeoutMs(600000)、conversationSessionMode も書き込みます。oar setup と初回起動を参照してください。
  • リレーは、Settings(設定)からプロバイダーの CLI をインストールまたは更新したときに cliBinaries を書き込みます。変更するのはこのキーだけです。ファイルを JSON として読めない場合は書き込みを拒否し、その結び付けは実行中のプロセスの中だけで保持します。
  • リレーは、起動時にファイルがなければ作成します。内容は空の authToken、ポート 3333、localhostOnly: true、pollIntervalMs、conversationSessionMode です。古いリリースから残った features キーも削除します(非推奨、無視されるキー、内部用のキーを参照)。
  • あなたが、任意のテキストエディターで書き込みます。

手で編集する #

ファイルは 1 つの JSON オブジェクトです。省いたキーは既定値になり、previews のような入れ子のブロックはまとめて 1 つとして読み込まれます。編集したら、リレーを再起動します。リレーがファイルを読み込むのは起動時の 1 回だけです。 ファイルを保存しても、実行中のリレーが保持している内容は何も変わりません。再起動は oar restart(グローバルインストール)か、会話の ⋯ メニューの 🌄 Restart web relay(Web リレーを再起動)で行います。

  • 不明なキーは無視され、そのまま残ります。セットアップやリレー自身の書き込みでも残ります。
  • 不正な JSON でもリレーは止まりません。Failed to read config.json, using defaults. とログに出し、既定値で動作します。つまりポート 3333、このマシンのみ、起動のたびに新しくなるランダムなトークン(ログに出力)です。ファイルを直すまで、保存したトークンは使えなくなります。もう 1 つの読み取り処理、つまりデータフォルダーを選ぶ処理は、既定のフォルダーに戻ります。リレーは壊れたファイルには触れません。
  • 誤った値はキーごとに扱われます。下の既定値は、タイマーや上限の値がないか使えないときにリレーが使う値です。トンネルとプレビューレーンはオフのままになり、理由をログに出します。リレー自体は動作し続けます。
  • 1 回の実行に限り、コマンドラインがファイルより優先されます。node server/server.js の --token <value> と --port <number>(oar copilot も渡しますが、oar start は渡しません)は authToken と port を上書きし、ファイルには保存されません。1 ~ 65535 の数値でない --port は、警告を出して無視されます。

JSON として正しくないファイルに対して oar setup を実行しないでください

oar setup は、解析できないファイルをないものとして読みます。その上で新しいトークンを入れた新しい config.json で上書きするので、古いファイルのほかのキーはすべて失われます。先に JSON を直してください。手で編集するファイルは、コピーを取っておいてください。

ネットワークとアクセス #

キー 型 既定値 動作
authToken 文字列 なし:起動ごとにランダムなトークン すべてのブラウザー、ワーカー、API クライアントがサインインに使うトークンです。空の場合、リレーは起動のたびにランダムなトークンを作り、ログに出力しますが、保存はしません。oar setup は固定のトークンを書き込みます。
port 数値 3333 HTTP と WebSocket のポートです。1 ~ 65535 の整数です。
localhostOnly 真偽値 true true にするとリレーを 127.0.0.1 にバインドし、このマシンからだけ接続できるようにします。それ以外の値(false、null、1、"yes" を含む)では、すべてのインターフェース(0.0.0.0)にバインドし、LAN から接続できるようにします。オンとみなされるのは true とテキストの "true"(大文字小文字は問わない)だけです。既定値が使われるのは、キーがない場合だけです。下のトンネルには影響しません。
remotePath 文字列 "" リバースプロキシがリレーをサブパスで提供するときのパスのプレフィックスです(例:/oar)。先頭のスラッシュは補われ、末尾のスラッシュは取り除かれます。リレーは受け取ったリクエストからプレフィックスを外し、サインインの Cookie のパス、ソケットのパス、ファイルと共有リンクのアドレスにプレフィックスを付けます。
trustProxy Express の trust proxy の値 "loopback" リレーが信頼する X-Forwarded-* ヘッダーを設定できるプロキシです。クライアントのアドレス(レート制限、サインインのロックアウト、共有のアクセスログ)と、新しい共有リンクのホストとスキームは、この設定を通して読み取られるので、直接接続したクライアントはこれらを偽装できません。既定値は、同じマシン上のプロキシやトンネルに適しています。別のホストのプロキシがリレーに転送する場合は、ホップ数(1)、アドレスやサブネット("10.0.0.0/8")、またはそれらのリストを使います(リバースプロキシ)。
allowedOrigins 文字列の配列 [] 0.9.11 で追加 リレー自身のオリジンに加えて、ライブの Socket.IO 接続が受け付けるブラウザーのオリジン(スキーム、ホスト、既定以外のポート。例:"https://relay.example.com")です。Host ヘッダーを書き換えるプロキシで必要です。リバースプロキシを参照してください。
publicHostnames 文字列の配列 [] リレー自体に到達するホスト名です。プレビューレーンは、これらのいずれか(および localhost と 127.0.0.1)を使う previews.publicBaseUrl を拒否します。これにより、プレビューしたアプリがリレーとサインインの Cookie を共有することはありません。
tunnelMarkerHeaders 文字列の配列 [] トンネルのエッジがトラフィックに付け加える追加のヘッダー名です。cf-ray かこれらのヘッダーのいずれかを含むリクエストは、セッションワーカーのパス(自分のエージェントのワーカーが使うソケットで、このマシン上でだけ動作します)に到達できません。cf-ray は常にリストに入っています。カンマ区切りの文字列も使えます。環境変数 COPILOT_TUNNEL_MARKER_HEADERS(カンマ区切り)の名前はこれらに追加されます。ここを空のリストにしても、それらは無効になりません。
pushVapidSubject 文字列 mailto:copilot-remote@example.com リレーが Web Push のリクエストとともにプッシュサービスに送る連絡先アドレスです(通知)。自分の mailto: アドレスに設定してください。
sharedPresenceMaxPerConversation 数値 200 1 つの共有した会話のリンクで数えるライブの閲覧者の最大数です。1 以上です。上限に達すると、最も長くアイドル状態の閲覧者が外され、空きが作られます。
sharedPresenceMaxGlobal 数値 5000 数えるライブの共有リンク閲覧者の合計の最大数です。ルールは同じです。会話ごとの上限より低くなることはありません。

最初の接続、トークン、LAN アクセスについては、初回起動を参照してください。

ターンとタイマー #

キー 型 既定値 動作
processingTimeoutMs 数値(ミリ秒) 600000 ワーカーから動作の兆候がないまま、リレーがターンをキューに戻すまでの時間です。ターンの長さの上限ではありません。0 以下の値では既定値が使われます。ターンが停滞したときを参照してください。
maxRequeueRetries 数値 5 1 つのメッセージを試行できる回数です。これを超えると最終的に失敗します。1 以上です。キューへの戻しを参照してください。
contextIndicatorMode "default" または "bar" "default" 入力欄がコンテキストの埋まり具合を、上端に沿った線でどう表示するかです。default は全幅の線で、コンテキストが埋まるにつれて色が緑から赤に変わります。bar は同じ線が、使用したコンテキストの割合まで左から伸びます。それ以外の値は、大文字小文字にかかわらず default になります。

ターンの最大時間、バックグラウンドタスクのタイムアウト、停滞の監視はここにはありません。ターンが停滞したときを参照してください。

再起動とシャットダウン #

これらのキーは、計画的なリレーの再起動(🌄 Restart web relay)の動作を決めます。再起動と再開を参照してください。各タイマーはミリ秒で指定します。0 以下の値や数値でない値では、既定値が使われます。

キー 型 既定値 動作
restartShutdownTimeoutMs 数値(ミリ秒) 45000 再起動が、実行中のターンの終了を待つ時間です。これを過ぎると shutdown-timeout の失敗で中止します。
restartGracefulTimeoutMs 数値(ミリ秒) 8000 リレーが正常な停止を待つ時間です。これを過ぎると再起動を強制します。
restartSpawnTimeoutMs 数値(ミリ秒) 18000 1 回の試行が再起動または再開の段階を待つ時間です。これを過ぎると失敗とみなされます(spawn-timeout)。
restartRebindTimeoutMs 数値(ミリ秒) 20000 1 回の試行が、再起動後にセッションが再接続するのを待つ時間です(rebind-timeout)。
restartReadyCooldownMs 数値(ミリ秒) 1000 再起動が準備完了を報告した直後に、キューが一時停止したままになる時間です。
restartMaxAttempts 数値 3 再起動が確定するまでに行える試行の回数です。1 以上です。
restartRetryBackoffMs 数値の配列(ミリ秒) [1000, 3000, 7000] 2 回目、3 回目以降の試行の前の待ち時間です。試行の回数が要素の数より多い場合は、最後の要素が繰り返されます。正の数でない要素は除かれ、結果が空なら既定値が使われます。

メモリ 0.9.19 で追加 #

キー 型 既定値 動作
heapLimitMb 数値(MB) RAM の 60%、2,048〜8,192 リレーのヒープ上限です。512 以上の整数で指定します。リレーのどの起動方法でも読み込まれます:oar start、systemd サービス、Windows の自動起動、CLI 拡張機能。次回の起動から有効です。512 以上の整数でない値はログに 1 行残して無視され、マシンの RAM、またはコンテナーのメモリ制限を超える値は、その大きさまで下げられます。NODE_OPTIONS の --max-old-space-size、または server.js を起動する node のコマンドラインにあるものが優先されます。リレーのメモリ不足を参照してください。

ワークスペースとデータ #

キー 型 既定値 動作
workspaceRootAllowList 文字列の配列 未設定 会話を開始できる絶対パスのフォルダーです。その中にあるものもすべて含みます。未設定または空の場合は、存在する任意のフォルダーを許可します。存在するフォルダーでない要素は、ログに出して除外します。環境変数 COPILOT_WORKSPACE_ROOT_ALLOW_LIST が設定されていれば、そちらが優先されます。チャットを開始できる場所の制限を参照してください。
dataDir 文字列 サーバーの隣の data/ データベースとリレーのロックファイル、0.9.17 で追加 DeepSeek のチャットの Claude Code の状態である deepseek-claude を置く場所です。相対パスは config.json を含むフォルダーを基準にします。アップロードもこれに従い、その中の uploads/ に置かれます。アップロードをサーバーの隣の uploads/ に置くのは、COPILOT_WEB_RELAY_DATA_DIR を使わず、既定のサーバーの隣の data/ を使うリレーだけです。COPILOT_WEB_RELAY_DATA_DIR が設定されていれば、そちらが優先されます。oar start、oar restart、Linux の systemd サービスは常にこの変数を設定する(~/.oar/data、%APPDATA%\oar\data、または自分で設定した値)ので、そのように起動したリレーではこのキーは効果がありません。このキーは、直接起動するチェックアウト向けです。Windows の起動時のランチャーが固定するのは設定ファイルだけで、この変数は固定しません。

プロバイダーの CLI #

キー 型 既定値 動作
cliBinaries オブジェクト リレーが書き込む プロバイダーごとの CLI のパスです(claude と grok)。Settings からのインストールでパスが確定したときにリレーが書き込み、次の起動時にこれを使って同じプログラムを再び見つけます。パスを手で設定することもできます。実行可能ファイルでない要素は、ログに出して無視されます。それ以外の名前は、copilot も含めて使われません。
sdkPath 文字列 自動検出 Copilot SDK の index.js へのパスです。インストール済みの Copilot CLI の検索が省かれるのは、sdkPath と cliPath の両方が設定されているときだけです。単独で設定した場合は、拡張機能エンジンの起動ファイルをその隣で探す場所としても使われます。
cliPath 文字列 自動検出 Copilot CLI のランタイムのエントリ(app.js)へのパスです。sdkPath と一緒に使います。環境ですでに CLI のプログラムが指定されていない限り、リレーは起動する Copilot のワーカーにもこれを CLI のプログラムとして渡します。
sdkVersion 文字列 見つかった最新のもの 1.0.63 のような正確なバージョンです。インストール済みの Copilot CLI の検索で、そのバージョンだけを受け付けます。sdkPath と cliPath の両方が設定されている場合は無視されます。

これらのキーが関係するのは、リレーがインストール済みの Copilot CLI と直接やり取りする場合です。たとえば既存の Copilot セッションの取り込みやモデルの一覧の取得です。検索では Copilot CLI のパッケージキャッシュを探します(COPILOT_PKG_DIR で、最初に探すフォルダーを 1 つ追加できます)。GitHub Copilot を参照してください。

プレビュー #

previews ブロックはプレビューレーンを有効にします。プレビューレーンは専用のポートとホスト名を持つ 2 つ目のリスナーで、ローカルの開発サーバーとフォルダーを公開します。セットアップ、ホスト名、前段のプロキシについては、preview ツールのページにあります。

キー 型 既定値 動作
previews.enabled 真偽値 false レーンを有効にします。有効とみなされるのは true だけです。
previews.port 数値 リレーの port + 1 プレビューのリスナーのポートです。1024 以上で、リレーのポート以外にします。0 にすると、起動のたびに空いているポートを選びます。
previews.bindHost 文字列 127.0.0.1 リスナーがバインドするアドレスです。ループバック以外のアドレスには previews.allowPublicBind が必要です。
previews.allowPublicBind 真偽値 false ループバック以外の previews.bindHost を許可します。その場合、すべてのプレビューに、前段のプロキシを通さずにネットワークから到達できるようになります。
previews.publicBaseUrl 文字列 なし レーンの公開 http(s) アドレスです。プレビューが有効なときは必須です。ホスト名はリレーのものと異なる必要があります(publicHostnames を参照)。末尾のスラッシュは取り除かれます。
previews.allowedTargetHosts 文字列の配列 [] このマシン以外に、ポートのプレビューが向けられるホストです。たとえばコンテナーや VM のアドレスです。
previews.maxLive 数値 8 リレー全体で同時に存在できるプレビューの最大数です。正の整数でない値では 8 が使われます。

プレビューが有効なときにこれらのルールのいずれかを満たさないと、リレーは理由とともに PREVIEW LANE disabled とログに出し、レーンをオフのままにして動作を続けます。

次の環境変数は、対応するキーを上書きします。COPILOT_PREVIEWS_ENABLED(1、true、0、false)、COPILOT_PREVIEWS_PORT、COPILOT_PREVIEWS_BIND_HOST、COPILOT_PREVIEWS_PUBLIC_BASE_URL、COPILOT_PREVIEWS_ALLOWED_TARGET_HOSTS(カンマ区切り)です。

トンネル #

ネットワークの外からリレーに到達するためのトンネルは 2 種類あります。互いに独立していて、同時に動かせます。どちらも既定ではオフで、必須の値が欠けている管理対象のトンネルはオフのままになり、理由をログに出します。

sshTunnel #

自分のサーバーへのリバース SSH トンネルです。SSH トンネルを参照してください。

キー 型 既定値 動作
sshTunnel.mode "disabled" または "managed" "disabled" managed にすると、リレーがトンネルを実行し、再起動します。
sshTunnel.required 真偽値 false 管理対象のトンネルが接続されていない間(最初に接続する前や、必須の値が欠けている場合を含む)、リレーはキューからメッセージを取り出すのを一時停止します。
sshTunnel.user 文字列 なし サーバー上の SSH ユーザーです。管理対象の場合は必須です。
sshTunnel.host 文字列 なし サーバーのホスト名またはアドレスです。管理対象の場合は必須です。
sshTunnel.remotePort 数値 なし サーバー上で開くポートです(1 ~ 65535)。管理対象の場合は必須です。
sshTunnel.remoteBind "loopback" または "public" "loopback" リモートのポートをサーバー自身でだけ開くか、サーバーのすべてのインターフェースで開くかです。localhostOnly とは独立しています。
sshTunnel.command 文字列 ssh SSH のプログラムです。PATH 上の名前か絶対パスを使います。相対パスは、リレーのプログラムのフォルダーを基準にします。
sshTunnel.identityFile 文字列 なし 使用する秘密鍵です。~ は展開されます。指定しない場合、SSH はエージェントか既定の鍵を使います。
sshTunnel.autoReclaimPort 真偽値 true リモートのポートがすでに使われているとき、サーバー上でクリーンアップを実行して再試行します。オフになるのは false のときだけです。
sshTunnel.reclaimStaleSshSessions 真偽値 false そのクリーンアップの一部として、サーバー上で何も実行していない自分の SSH セッションも終了します。
sshTunnel.remoteCleanupCommand 文字列 組み込み 組み込みのものの代わりにサーバー上で実行する、自分のクリーンアップコマンドです。

cloudflaredTunnel #

Cloudflare の cloudflared を実行します。これは自分でインストールするもので、OAR には同梱されていません。Cloudflare Tunnel を参照してください。

キー 型 既定値 動作
cloudflaredTunnel.mode "disabled" または "managed" "disabled" managed にすると、リレーが cloudflared を実行します。COPILOT_CLOUDFLARED_MODE で上書きされます。
cloudflaredTunnel.required 真偽値 false 管理対象のトンネルが接続されていない間(必須の値が欠けている場合を含む)、リレーはキューからメッセージを取り出すのを一時停止します。
cloudflaredTunnel.token 文字列 なし 自分の Cloudflare トンネルのトークンです。管理対象の場合は必須です。COPILOT_CLOUDFLARED_TOKEN で上書きされます。
cloudflaredTunnel.binary 文字列 cloudflared プログラムです。絶対パスか、PATH 上で探す名前で指定します。COPILOT_CLOUDFLARED_BINARY で上書きされます。
cloudflaredTunnel.extraArgs 文字列の配列 [] cloudflared tunnel run --token <token> の後に追加する引数です。

Web UI と環境での設定 #

Web UI での設定はこのファイルにはありません。 プロバイダーのスイッチとキー、モデルの一覧、ターンの最大時間、バックグラウンドタスクのタイムアウト、機能フラグは、データフォルダーにあるリレーのデータベースに保存されます。ファイルが保持するのは、データベースを開く前にリレーが必要とするもの(データフォルダー、ポート、トークン)と、マシンに関する事実(CLI のパス、トンネル)です。UI がファイルに書き込むのは cliBinaries だけです。0.9.17 で追加 DeepSeek のキーもここにはありません。DeepSeek の API キー、ベース URL、予算は、Settings → Providers → DeepSeek(設定 → プロバイダー → DeepSeek)からデータベースに保存されます。

環境変数。 完全な一覧は環境変数にあります。キーに対応する変数がある場合、変数がファイルより優先されます。該当するのは COPILOT_WEB_RELAY_DATA_DIR(dataDir)、COPILOT_WORKSPACE_ROOT_ALLOW_LIST、COPILOT_CLOUDFLARED_*、COPILOT_PREVIEWS_*(それぞれのセクションに記載)です。COPILOT_TUNNEL_MARKER_HEADERS は例外で、その名前は tunnelMarkerHeaders に追加されます。1 回の実行に限り、--token と --port のオプションがその両方より優先されます。COPILOT_WEB_RELAY_CONFIG 自体については、ファイルの場所で説明しています。

例 #

値はすべて架空のものです。使わないブロックは削除してください。

{
  "authToken": "0f3c1a9e-example-token-do-not-copy",
  "port": 3333,
  "localhostOnly": false,
  "remotePath": "",
  "trustProxy": "loopback",
  "allowedOrigins": [],
  "publicHostnames": ["relay.example.com"],
  "tunnelMarkerHeaders": ["x-edge-request-id"],
  "processingTimeoutMs": 600000,
  "maxRequeueRetries": 5,
  "contextIndicatorMode": "bar",
  "workspaceRootAllowList": ["/home/dev/projects", "/srv/sites"],
  "dataDir": "data",
  "cliBinaries": {
    "claude": "/home/dev/.local/bin/claude",
    "grok": "/home/dev/.grok/bin/grok"
  },
  "restartShutdownTimeoutMs": 45000,
  "restartGracefulTimeoutMs": 8000,
  "restartSpawnTimeoutMs": 18000,
  "restartRebindTimeoutMs": 20000,
  "restartReadyCooldownMs": 1000,
  "restartMaxAttempts": 3,
  "restartRetryBackoffMs": [1000, 3000, 7000],
  "previews": {
    "enabled": true,
    "port": 3334,
    "bindHost": "127.0.0.1",
    "allowPublicBind": false,
    "publicBaseUrl": "https://preview.example.com",
    "allowedTargetHosts": [],
    "maxLive": 8
  },
  "sshTunnel": {
    "mode": "managed",
    "required": false,
    "user": "ubuntu",
    "host": "vps.example.com",
    "remotePort": 4444,
    "remoteBind": "loopback",
    "identityFile": "~/.ssh/id_ed25519"
  },
  "cloudflaredTunnel": {
    "mode": "disabled",
    "token": "",
    "binary": "cloudflared",
    "extraArgs": []
  }
}

非推奨、無視されるキー、内部用のキー #

ファイルにこれらのキーがあっても、残しておいても削除してもかまいません。

キー 内容
features 廃止されました。機能フラグは現在リレーのデータベースに保存され、Settings → Features(設定 → 機能)にあります。起動時にリレーはここにある値をデータベースにコピーし(データベースにすでに値が保存されている場合を除く)、ファイルからキーを削除します。
sshTunnel.enabled、cloudflaredTunnel.enabled mode の古い形式です。true は managed を意味し、mode が disabled でも managed でもない場合にだけ読み込まれます。
pollIntervalMs 新しいファイルに書き込まれますが、リレーは読み込みません。効果はありません。
conversationSessionMode isolated または shared です。新しいファイルに書き込まれます。リレーは値を各セッションのレコードに保存し、ステータスで報告しますが、OAR のどの部分もどちらの値でも動作は変わりません。あなたにとって効果はありません。
cliPort、model 手で起動するスタンドアロンモード(開発者向けの抜け道で、これを起動する oar コマンドはありません)だけが使います。oar start で起動するリレーは model を無視します。cliPort は 1 つの目的にだけ読み込みます。プレビューレーンがそのポートを選ばないようにするためです。
host リレーに接続するプログラム(セッションワーカーと Copilot 拡張機能)だけが、使用するアドレスを組み立てるために読み込みます。リレー自身のリスナーは無視します(localhostOnly を参照)。省いてください。