Repository navigation
派生イメージ(general・php・php85)の言語サーバ(#236)は、devbase build でイメージを建て直した後に届きます。
Added
- 自分で OpenBao サーバを立てて使うための文書とポリシーの雛形・試用の構成を足しました(#295)。
OpenBao サーバを用意するが、個人の形(自分で 1 台)・チームの形(チームで 1 台)・
既存のサーバの形(組織のサーバへ接続)の 3 つを分け、KV v2 のマウント・AppRole・ポリシー・entity と alias・
ロール・端末ごとのsecret_idの発行と失効をbaoのコマンドで示します。ポリシーの雛形(version: 1/2)と、
開発モードの OpenBao を手元に立てる試用の構成(compose.yml)はdocs/user/openbao/にあります。
個人の形もアカウントグループごとの置き場(version: 2)を使い、プロジェクトでDEVBASE_ACCOUNT_GROUP=personalを
宣言します。接続のコマンドと引数、既存のサーバへの接続の手順は変わりません。 general・php・php85の派生イメージに、Python・TypeScript・PHP の言語サーバを入れました(#236)。
pyright-langserver(pyright 1.1.414)・typescript-language-server(6.0.2、TypeScript 5.9.3 を使う)・
intelephense(1.18.5)が PATH の上にあり、コンテナに入った時点で Claude Code の公式 LSP プラグインから起動できます
(プラグインは利用者が入れます)。言語サーバは/opt/language-serversに root で入り、利用者のnpm i -gの領域とは
分かれます。tscは base と同じ 7.0.2 のままです。イメージの展開後の大きさは約 148MB 増えます。
base とほかの派生イメージは変わりません。届くのはイメージを建て直した後です(devbase build)。
Serena の MCP は今までどおり、初回の起動でserena-agentと自分の言語サーバを取得します(ネットワークが要ります)。
Changed
devbase listの TUI の「エディタを開く (open)」で、dev コンテナが 2 つ以上動いているときは開くものを選べるようにしました。
これまでは常に既定の番号(DEVBASE_OPEN_INDEX、無ければ 1)を開いていました。カーソルの初期位置は既定の番号で、
Esc でサブメニューへ戻ります。動いているものが 1 つのときと、CLI のdevbase openの振る舞いは変わりません。https://dl.basex.jp/を devbase の紹介ページにしました。 これまでのワンライナーだけの案内に替え、できること・
はじめ方・コマンドの体系・はじめから入っている道具・ドキュメントへの入口を 1 枚にまとめました(コピーのボタン付き)。
ロゴ(base の上に層が積まれる形)とアイコンは自前で描いたものです。ページの正本はsite/index.htmlです。ワンライナーの URL(https://dl.basex.jp/i)と配信の中身は変わりません。- シェル補完(bash・zsh)が、
--context NAMEを受け付けるすべてのサブコマンドで--contextを出すようにしました(#435)。
これまではopenとproject post-startだけでした。up・down・ps・login・scale・build・rebuild、
project/containerの配下(logs・profile up|down|listを含む)、env exec・env tokenで、-を打って補完すると
--contextが候補に出ます(devbase up web -<TAB>のようにプロジェクト名の後でも出ます)。値(docker context の名前)は補完しません。
-で始まらない語の候補は変わりません。 - スナップショットが、作り直せる一時ファイル・ログ・取り直せる取得物を控えないようにしました(#368)。
既定で.codex/logs_2.sqlite(-wal・-shmを含む)・.codex/.tmp・.codex/cache・.claude/plugins/cache・
.claude/plugins/marketplaces・.serena/logs・.gemini/tmp/*/logs.json・.gemini/tmp/*/logsを、フル・差分・
復元前バックアップから外します。会話の記録(.gemini/tmp/<プロジェクト>/chats/を含む)・入れたプラグインの一覧と
データ・.serena/language_serversはこれまでどおり控えます。外したパスは復元後のボリュームに無く、各 CLI が作り直します。
backups/exclude.ymlのexcludeにボリュームの中の相対のパスを並べると、除外を足せます。
世代のmeta.ymlに作ったときの除外の一覧(exclude)を残し、今と違う除外の一覧の世代へは差分を積みません。
更新後の最初のdevbase upの自動スナップショットは、系列ごとに新しい世代(フル)を作ります。
除外の一覧が違う世代をdevbase snapshot create --nameで指定すると、差分を作らずに終了コード 1 で止まります。
既存の世代はそのまま一覧・復元できます。 - VS Code Server の本体(
~/.vscode-server/bin)だけを全コンテナ共通の 1 本のボリュームdevbase_vscode-server-binに
置くようにしました(#463)。 これまではコンテナ 1 つに 1 本のdevbase_vscode_<プロジェクト>_<番号>が
~/.vscode-serverを丸ごと持ち、VS Code の更新のたびに約 0.6GB の版が各ボリュームへ溜まっていました。
今は本体の版をプロジェクトとインスタンスの数だけ重ねて持たず、コンテナの起動がbin/の版を新しい順に 5 つまで残し、
同時の展開で残った入れ子の本体と古い展開の途中のディレクトリも消します(この片付けは base と派生イメージを
建て直した後から効きます)。
拡張機能・リモート側の設定(data/Machine/settings.json)・ローカル履歴・拡張機能がリモート側に保存する状態は、
ボリュームに置かずコンテナの書き込みレイヤーに残るため、devbase upでコンテナを作り直すたびに消えるようになります。
手で入れた拡張機能は入れ直しになり、Dev Containers の既定の拡張機能は作り直しの後の attach で入り直します。
window.titleはdevbase upが毎回書き直します。docker restartと端末の再起動では消えません。
移った後の最初の attach で本体(約 215MB)を取り直します。以前のdevbase_vscode_<プロジェクト>_<番号>は付けず、
中身も引き継がず、devbase は消しません。残っている間はdevbase upの最後に名前と消すコマンドが出るので、
利用者がdocker volume rmで消してください(使わなくなった VS Code Server ボリュームを消す)。
建て直す前のイメージでも attach できるよう、devbase up/scale/project post-startの起動の後の処理が
~/.vscode-server/binを開発ユーザーが書ける形に揃えます。
Fixed
-
VS Code の attach が「Copy extensions to remote」で止まらないようにしました(#507)。
Dev Containers 拡張は、拡張のキャッシュを VS Code を動かしている手元の端末に 1 つ持ち、拡張の名前だけで選んで
コンテナへ送ります。arm64 の端末(Mac など)と x86_64 のサーバーの両方へ同じ VS Code から attach すると、
別の CPU 向けの拡張が送られて止まっていました。dev コンテナへ名前vscodeのボリュームを/vscodeに付け、
拡張のキャッシュと VS Code Server の新しい版の本体を docker ホストごとの置き場に持たせます。コンテナを作り直しても、
拡張は取り込み直しません。拡張のキャッシュはdevbase upなどの起動の後の処理が拡張ごとに新しい 3 版へ減らします。
反映するにはdevbase upでコンテナを作り直します。同じ docker ホストの dev コンテナは、プロジェクトごとにすべて
作り直してください。~/.vscode-server/binは全 dev コンテナで共有のボリュームで、作り直したコンテナは
そこへ/vscodeを指すリンクを置きます。作り直していないコンテナには/vscodeが無く、そのリンクは切れて見えます。 -
TLS を傍受するプロキシ(Netskope など)の下でも、ホストの devbase が OpenBao へ繋がるようにしました(#497)。
OpenBao の証明書を OS の信頼ストア(macOS はキーチェーン)で検証します。これまでは Python の既定の CA で検証し、
プロキシの CA を知らずにOpenBao へ到達できないため、…のキャッシュを使いますと出てキャッシュへ落ち、書き込みも
できませんでした。SSL_CERT_FILEや別に置いた Python 3.12 で打つ回避は要りません。検証は緩めず、OpenBao 以外の
通信(boto3 など)の検証は変わりません。依存にtruststoreを足しました。次のdevbaseの起動で自動で入ります。 -
devbase up/devbase scaleの起動の待ちの時間切れの文言が、巡の回数と実際に待った秒数を出すようにしました(#374)。
制限は 1 秒休む巡の回数(60 巡)で数え、docker の呼び出しにかかる時間を含まないため、実際に待つ時間は 60 秒より
長くなります。これまでのtimeout (60s) ...は 60 秒で止まったと読めました。今は
timeout after 60 rounds (73s elapsed) waiting for the entrypoint to completeの形で出ます。数え方と制限は変わりません。 -
devbase env <TAB>の候補にtokenとbackendが出るようにしました(#454)。 bash と zsh の補完の
サブコマンドの一覧に 2 つが無く、名前を手で打たないと使えませんでした。一致テストがenvのサブコマンドの
全部を bash と zsh の一覧と比べるようになり、envのサブコマンドを足したときの取り残しで落ちます。 -
接続先 URL が手元のサーバ(
http://127.0.0.1:8200などhttpの loopback)のとき、devbase upしたコンテナの中の
baoがサーバへ届くようにしました(#295)。 これまではコンテナへ渡すBAO_ADDRがそのまま127.0.0.1を指し、
コンテナ自身へつながっていました。Docker が手元の端末のものなら、コンテナのBAO_ADDRのホストを
host.docker.internalにし、dev コンテナへhost.docker.internal:host-gatewayの行を足します。httpsの URL・
別の端末の Docker(docker.context)・network_mode: hostの dev サービスでは今のままです。手元の devbase が使う
URL は変わりません。次のdevbase upから効きます。確かめた環境は macOS の Docker Desktop です。 -
既にある世代の名前で
devbase snapshot create --name <名前> --fullを打つと、その世代を今のボリュームの全体で
作り直すようにしました(#458)。 これまではfull.tar.zstを作り直せずに終了コード 1 で止まり、そのとき
snapshot.snarだけが進んでいました。作り直した世代は前のフルと差分を持たず、その世代から前の時点へは戻せません。
前の時点を残したいときは別の名前で作るか、先にdevbase snapshot copyで写してください。控えに失敗したときは
世代が打つ前のまま残ります。入れ替えの途中で止まった世代はrestoreがボリュームを消す前に止まり、同じ名前で
もう一度--fullを打つと作り直せます。
これまでに既存の世代の名前へ--fullを打って失敗したことがあり、その後に同じ世代へ差分が積まれていれば、
その世代の差分は失敗の前の変更を欠いていることがあります。 世代のファイルからは見分けられないため、
心当たりがあれば新しい世代を作ってください(devbase snapshot create)。 -
既存の世代へ差分を積む
devbase snapshot create --name <名前>とdevbase upの自動スナップショットが失敗しても、
世代のsnapshot.snarと差分を打つ前のまま残すようにしました(#466)。 これまでは失敗した回にsnapshot.snarだけが
進み、その後の差分が失敗の前の変更を含まず、復元でそのファイルが無いか古い中身になっていました。書く途中で止まった
作りかけのincr-NNN.tar.zstも残り、復元がそのアーカイブで止まることがありました。今は失敗の後の差分が失敗の前の
変更も含みます。tar が読み取りで止まった(終了コード 2 以上)控えも失敗として扱います。失敗したときの知らせ方
(createは終了コード 1、devbase upは警告 1 行で起動を続ける)は変わりません。差分の作成はsnapshot.snar.bakを作らなくなりました。
これまでに差分の作成が失敗したことのある世代は、その後の差分が失敗の前の変更を欠いていることがあります。
世代のファイルからは見分けられないため、心当たりがあれば新しい世代を作ってください(devbase snapshot create)。
作りかけの差分で復元が止まる世代は、devbase snapshot restore <名前> --point <その前の番号>でその前の時点へ戻せます。 -
プロジェクトの
envにDEV_SERVICE_NAME=と空で書いたとき、開発サービス名をdevとして扱うようにしました(#425)。
これまでdevbase buildはdevを建てる一方、up・login・open・post-start・scale・--expiresの判定・
token の配布は空の名前のサービスを探して開発サービスを見失っていました。未設定や空でない値のプロジェクトは変わりません。 -
SSH から立てた tmux のセッションに手元の Mac の端末から attach し直したとき、
devbase editor openとdevbase up --openが
VS Code を開かず「SSH セッションを検出しました」とコマンドを提示するだけになっていたのを直しました。
tmux 内では、SSH かどうかをペインのシェルに残ったSSH_CONNECTIONではなく、tmux のセッション環境(attach のたびに
更新される)で判定します。あわせて、接続できないVSCODE_IPC_HOOK_CLIと、ペインを作ったクライアントと attach し直したクライアントの SSH 状態が
食い違う(SSH から立てた tmux に手元から、手元で立てた tmux に Remote-SSH から attach し直した)ペインに残る以前の
VSCODE_IPC_HOOK_CLI(ウィンドウが開いたままで接続できても)は使わないようにしました。tmux のセッション環境にいまの
クライアントの値があればそれを使い、無ければ SSH ではコマンドの提示、手元では手元のcodeの起動になります。
このときPATHに残る Remote-SSH のremote-cliのcodeは使わず、手元のcodeを起動します(見つからなければスキップします)。 -
同じ秒に
devbase snapshot restoreを続けて打っても、復元前バックアップが前の控えを上書きしないようにしました(#473)。
復元前バックアップの名前pre-restore-<時刻>(秒まで)が既にある世代と重なったら、その世代には触らず、末尾に
通し番号を付けた名前(pre-restore-<時刻>-2、それも重なれば-3…)で新しく作ります。復元する世代がちょうど
同じ秒のpre-restore-*でも、展開するのは打つ前のその世代の中身です。通し番号の名前もほかのpre-restore-*と
同じ規則で保持・削除されます。