OpenCode の認証設定の追加 #3
Labels
No labels
enhancement
No milestone
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
genji1024/private-opencode-server#3
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
現在は
/opencodeで OpenCode Web UI 画面が表示されるが、チャットができない。エンドポイントや API トークンを設定し、Web UI からチャットができるようにする。@bot-genji1024 実装方針を立ててください。
@genji1024 実装方針を提示します。
実装方針: OpenCode の認証設定の追加(Web UI からチャット可能にする)
1. 現状把握
/opencodeで OpenCode Web UI を表示。opencode serve --hostname 0.0.0.0 --port 4096が稼働(Docker サービス opencode-srv)。src/app/opencode-proxy/[[...path]]/route.tsがOPENCODE_SERVER_URL(既定 http://127.0.0.1:4096)へ転送し、fetch/EventSource のパスを書き換え。src/middleware.ts/src/lib/auth.ts/src/app/api/auth/route.ts)あり。docker-entrypoint-opencode.shがauth.json+opencode.jsoncを動的生成し、STREAMABLE_HTTP_AUTH_TOKEN等を設定。2. 原因の切り分け(想定される主因)
STREAMABLE_HTTP_AUTH_TOKENによる Bearer 認証が opencode-srv 側で有効な場合、クライアントがトークンを送る必要がある。またプロキシがAuthorizationヘッダを opencode-srv へ転送できているか確認が必要。3. 実装方針(ステップ)
/opencode-proxy)に統一する。opencode-proxyの INJECT_SCRIPT 等の注入箇所を見直し、エンドポイントを正しく注入する。STREAMABLE_HTTP_AUTH_TOKEN(またはOPENCODE_SERVER_PASSWORD)を明示的に設定し、クライアントが Bearer トークンとして送信できるようにする。プロキシがAuthorizationヘッダを opencode-srv へ透過転送することを確認・実装する。.env.example/.envに認証関連変数(エンドポイント URL・トークン)を追加し、docker-entrypoint-opencode.shの生成設定と整合させる。4. 変更候補ファイル
src/app/opencode-proxy/[[...path]]/route.ts— エンドポイント / トークン / ヘッダ転送docker-entrypoint-opencode.sh— opencode.jsonc / auth.json 生成(認証設定).env.example/.env— 認証関連環境変数の追加src/lib/opencode-serve.ts— サーバー起動・ヘルスチェック5. 検証手順(受け入れ基準)
docker compose upで2サービス(app / opencode-srv)が起動する/opencodeを開き Basic Auth でログインできる6. 確認事項(実装着手時に要確認)
opencodeのバージョン 1.18.9 の仕様)を実物で確認してから設定値を確定する。STREAMABLE_HTTP_AUTH_TOKENとOPENCODE_SERVER_PASSWORDの使い分けを現行実装で確認する。この方針で問題なければ Step 1〜4 を実装に移ります。実装着手の承認、または方針への修正指示をお待ちします。
@bot-genji1024 すみません。私が「エンドポイントや API トークン」と書いたのは、OpenCode サーバがアクセスする LLM エンドポイントとそのアクセストークンを意図していました。個人的に OpenCode Go を契約しているので、そのエンドポイントと API キーをブラウザから入力することで認証できるようにしたいです。これを踏まえて、再度方針を立ててください。
@genji1024 要件を訂正いただきありがとうございます。ご指摘の通り、前回(#89)は「エンドポイント/APIトークン」を Web UI ↔ opencode-srv 間の接続設定と誤解していました。正しくは「OpenCode サーバがアクセスする LLM エンドポイント(OpenCode Go)とその API キーをブラウザから入力して認証する」という理解で、方針を立て直します。
要件の理解(確認)
auth.jsonのopencode-goプロバイダ等)に反映され、OpenCode サーバが OpenCode Go へ認証付きでアクセス/opencodeの Web UI からチャットできる現状の整理
OPENCODE_API_KEYはdocker-entrypoint-opencode.shで~/.local/share/opencode/auth.jsonの"opencode-go": {"type":"api","key":...}に書き込まれているconfigsテーブル +src/lib/store.tsの getConfig/setConfig、API はPUT /api/config/[key]src/app/settings/page.tsxに接続テストの先例(test-github-token)あり実装方針(案)
src/app/settings/page.tsxに「LLM エンドポイント」「LLM API キー」の入力欄を追加(API キーは password 型・マスク表示、既存の表示トグルを踏襲)CONFIG_KEYSにllm_endpoint/llm_api_keyを追加し、PUT /api/config/[key]→store.setConfig→ SQLite に保存(スキーマ変更不要)opencode-srvコンテナへ反映する手段として、(a) Next.js 側 API からauth.jsonを書き換えて opencode-srv を再起動、または (b) 保存値を docker-compose の env に書き出して再起動、のいずれかを採用auth.jsonのopencode-goにkeyを、エンドポイントは OpenCode 1.18.9 の baseURL 指定方法(auth.json のプロバイダ定義 or opencode.json の設定)を実装時に確定して設定test-github-tokenを流用し「LLM 接続テスト」API を追加(エンドポイント+キーで疎通確認し、結果を設定画面に表示).envに実値で存在するOPENCODE_API_KEYの扱い(削除 or ブラウザ入力値への一本化)も方針に含めるopencode_model等「保存はされるが利用されない」デッドキー問題をこの機会に整理(LLM 設定を実際の OpenCode 起動に使う経路を一本化)確認事項(実装着手前に確定したい点)
次のステップ
方針をご確認いただき、問題なければこの方針で実装に着手します(実装 PR を作成します)。
@bot-genji1024 方針は概ね問題ないと思います。反映方式 (a) と (b) の違いを詳しく説明していただけますか?
@genji1024 反映方式 (a) と (b) の違いを、このリポジトリの実際の構成に即して説明します。
前提(現状の仕組み)
opencode-srvは docker-compose のサービスで、docker-entrypoint-opencode.shがコンテナ起動のたびにOPENCODE_API_KEYから~/.local/share/opencode/auth.jsonを再生成します(chmod 600)。MCP 設定のopencode.jsoncも同様に環境変数から起動時に生成されます。configsテーブル(PUT /api/config/[key])に入るだけで、opencode-srv コンテナには伝わりません。opencode-srvにはボリュームマウントがありません(コンテナは再作成前提の使い捨て)。つまり「保存値を opencode-srv に反映する」とは、「auth.json(と baseURL)を更新し、opencode-srv を再起動する」ことを意味します。
(a) auth.json を直接書き換えて再起動
Next.js 側(API ルート)から opencode-srv コンテナ内の
~/.local/share/opencode/auth.jsonを直接編集し、opencode-srv を再起動する方式です。OPENCODE_API_KEYが compose の env に残る限り、再作成時に entrypoint が auth.json を再生成して書き換えが消えます。永続化するには compose 側のOPENCODE_API_KEYを外す必要があり、すると「ファイルが唯一の真実」になります。docker compose up -d(deploy.sh)でコンテナが再作成されると、コンテナ層に書いたファイルは消えます。「再作成後に再書き込み」という順序管理が必要で壊れやすいです。(b) docker-compose の env に書き出して再起動
保存値をリポジトリ直下の
.envに書き込み、docker compose up -dで再起動する方式です。.env→ compose → entrypoint → auth.json/opencode.jsonc の経路が動作しており、これを使うのが自然です。baseURL も「新設の env(例OPENCODE_LLM_BASE_URL)を entrypoint で設定ファイルに書き込む」形で同様に反映できます。.envへの書き込みと再起動トリガーだけで済みます(Docker ソケット共有は不要)。.envに平文保存(ただし現状のOPENCODE_API_KEYも同じ場所・同じ扱いのため、リスクは増えません)。.envへの書き込み+再起動(既存deploy.shの流用 or 専用反映エンドポイント)の実装が必要。推奨
Docker 運用前提のこの構成では (b) を推奨します。すでに「env → entrypoint → 設定ファイル」という再作成に強い経路が動いており、これに乗るのが最も壊れにくく、シークレット管理の一貫性も保てるためです。(a) はファイルを直接触る直感性はありますが、ボリュームなし・起動時再生成というこのリポジトリの特性と相性が悪く、再作成で設定が消える運用事故を招きやすいです。
(b) の方向で確定でよければ、具体的な変更箇所(
.envの追加変数・entrypoint への書き込み追加・設定画面からの反映フロー)を整理して実装に進みます。ご確認をお願いします。@bot-genji1024 (b) でよいと思います。実装と PR 作成をお願いします。
@genji1024 ご指示のとおり (b) の実装を行い、PR #4 を作成しました。
bot-genji1024 referenced this issue2026-08-25 11:55:59 +09:00