Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
a072cfa
docs: PLAN39 アカウントグループ単位の永続化ボリューム分離プランを追加する
takemi-ohama Aug 28, 2026
f077fe9
docs(PLAN39): レビュー指摘を受けて entrypoint の実行順序・シード範囲・切り戻し手順を修正する
takemi-ohama Aug 28, 2026
d0e2ad8
docs(PLAN39): 切り戻し手順のコマンドをボリューム直接マウントと存在確認込みに直す
takemi-ohama Aug 28, 2026
046fc62
docs(PLAN39): 鍵が未設定のプロファイルで旧 credentials.json を消す仕様と切替テストを追加する
takemi-ohama Aug 28, 2026
ebcac95
docs(PLAN39): 鍵削除の対象を固定の既定パスに限定しカスタムパスは消さない仕様にする
takemi-ohama Aug 29, 2026
02fe90c
docs(PLAN39): 鍵なし時の削除判定を 2 変数 × 3 状態の判定表へ書き直す
takemi-ohama Aug 29, 2026
1d85420
docs(PLAN39): 起動ログのフォールバック方針とボリューム削除の前提を補う
takemi-ohama Aug 29, 2026
ab76b5a
docs(PLAN39): gcloud/gws の永続化を CLOUDSDK_CONFIG 方式へ変更し ADC を既定にする
takemi-ohama Aug 29, 2026
8ca34f9
docs(PLAN39): Google 認証の手順書を作る Task 8 / PR5 を追加する
takemi-ohama Aug 29, 2026
ea46caa
docs(PLAN39): 実機で検証できた項目を前提 15〜19 として確定させる
takemi-ohama Aug 29, 2026
fd74926
docs(PLAN39): gws をベースイメージへ含める方針を Task 5 に追加する
takemi-ohama Aug 29, 2026
7f80a9b
feat(volume): アカウントグループのボリュームを解決・作成・マウントする (PLAN39 PR1) (#123)
takemi-ohama Aug 29, 2026
ddd8f5e
feat(container): AI 設定を共通 / アカウントグループの 2 層に分ける (PLAN39 PR2) (#124)
takemi-ohama Aug 29, 2026
a38a542
feat(gcp): 設定ディレクトリをグループ単位にし GCP_AUTH_MODE を新設する (PLAN39 PR3) (#125)
takemi-ohama Aug 29, 2026
c5cd22d
feat(snapshot,status): スナップショットのグループ対応と可視化・ドキュメント (PLAN39 PR4) (#126)
takemi-ohama Aug 29, 2026
6046a7d
docs(PLAN39): Google 認証の手順書を追加する (PLAN39 PR5) (#127)
takemi-ohama Aug 29, 2026
fdae99f
fix(gcp,snapshot): adc の変数除去を dev に限定しスナップショットのメタデータを検証する
takemi-ohama Aug 29, 2026
34f21ed
fix(snapshot): 復元先を devbase が作るボリュームだけに限定する
takemi-ohama Aug 29, 2026
bc3c133
fix(gcp): adc の変数除外も dev の列挙だけに限定する
takemi-ohama Aug 29, 2026
1a7ea94
fix(snapshot): 復元先のグループボリューム名を正規化後と一致させる
takemi-ohama Aug 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,52 @@
## [Unreleased]

### Added
- **永続化ボリュームをアカウントグループ単位に分離**しました (PLAN39 / #116)。
これまで認証情報と会話ログは全コンテナ共通の `devbase_home_ubuntu` に置かれていたため、
nyle.co.jp で認証した Claude Code / gcloud を kk-generation.com のプロジェクトが
そのまま引き継いでしまい、企業テナントの境界を越えていました。`DEVBASE_ACCOUNT_GROUP`
(未設定なら `default`) で使用する Google / AWS アカウントの単位を宣言すると、
グループごとに `devbase_home_<group>` が作られ `/persistent/group` としてマウントされます。

| 分類 | 置き場 | 内容 |
|---|---|---|
| 共通 | `/persistent/ai` (`devbase_home_ubuntu`) | `~/.claude/plugins` / `skills` / `commands` / `CLAUDE.md` / `settings.json`、`.codex` / `.serena` / `.kiro` / `.ssh` / `share` |
| グループ別 | `/persistent/group` (`devbase_home_<group>`) | `.claude.json`、`~/.claude` 本体 (認証・会話ログ)、`.gemini`、gcloud / gws の設定ディレクトリ |

`~/.claude/plugins` (238MB) のような共通資産はグループ数だけ重複しません。
`default` グループでは初回起動時に既存データを**コピー**してシードするため、
Claude Code の再ログインは発生しません (gcloud / gws はシード元が無いため
全グループで初回 1 回の認証が要ります)。使えないグループ名 (Docker のボリューム名に
できないもの・`ubuntu`・数字だけ) は `devbase up` の前にエラーで弾きます。
詳細は [コンテナ操作ガイド](docs/user/container-operations.md#アカウントグループ) を参照してください。

- **gcloud / gws の設定ディレクトリをアカウントグループ単位に永続化**しました。
`CLOUDSDK_CONFIG` / `GOOGLE_WORKSPACE_CLI_CONFIG_DIR` を `/persistent/group` 配下へ
向けることで、`gcloud auth login` / `gws auth login` のユーザー OAuth が
**コンテナを作り直しても保たれ**、かつグループをまたいで共有されなくなります。
`CLOUDSDK_CONFIG` は gcloud CLI 専用ではなく `google.auth` の探索経路そのものなので、
BigQuery クライアント等も同じ場所を見ます。あわせて `@googleworkspace/cli` (`gws`) を
base イメージへ追加しました (これまでどのコンテナにも入っておらず、設定だけ永続化しても
復旧しませんでした)。

- **`GCP_AUTH_MODE` を新設**しました。`adc` でサービスアカウント鍵を使わず
`gcloud auth application-default login` によるユーザー認証 (ADC) を使い、`key` で
従来どおり鍵を使います。未設定なら鍵の env の有無で自動判定するため、既存プロジェクトは
これまでどおり動きます。`adc` では `GOOGLE_APPLICATION_CREDENTIALS` と `BIGQUERY_KEY_FILE` を
**コンテナへ渡しません** (値だけ残して実体が無いと ADC はユーザー認証へフォールバックせず
`DefaultCredentialsError` で落ちるため)。

> **Warning:** `CLOUDSDK_CONFIG` の導入により、`~/.config/gcloud` は
> **gcloud の設定ディレクトリではなくなりました**。鍵モードで書き出される
> サービスアカウント鍵の置き場でしかなく、コンテナ層 (揮発) に残ります。設定を見たい
> ときは `$CLOUDSDK_CONFIG` を参照してください。

- **`devbase status` に解決されたアカウントグループ**を表示するようにしました。
コンテナの起動ログにも、グループ名と gcloud のアカウントが 1 行出ます。

> **Note:** 上記のうち entrypoint と Dockerfile に関わる変更は、反映に
> `devbase build --no-cache` によるイメージの再ビルドとコンテナの作り直しが要ります。

- **tmux の既定設定 (`/etc/tmux.conf`) を base イメージへ焼き込む**ようにしました。tmux は
起動時に端末の代替画面へ切り替わるため、出力履歴は VS Code のスクロールバックではなく
tmux 自身のバッファに入ります。これまでコンテナの tmux は素の初期状態 (履歴 2000 行・
Expand Down Expand Up @@ -51,6 +97,23 @@
> 再ビルドしていないイメージでは、これまでどおり全フォルダを載せたワークスペースが
> 書き出されます (機能が黙って失われることはありません)。

- **スナップショットの対象が 2 ボリューム**になりました (共通 + アカウントグループ)。
メタデータに対象ボリューム名を記録し、`devbase snapshot list` にも表示します。
分離前に作られた既存スナップショットは**そのまま復元できます**。対象ボリュームの構成が
変わったときは、旧世代へ壊れた差分を積まないよう新しい世代を作ります (旧世代の差分状態
ファイルは別のレイアウトを記録しているため、そこへ差分を積むと差分が壊れます)。
- **`devbase env init` は鍵を登録したときだけ** `GOOGLE_APPLICATION_CREDENTIALS` /
`BIGQUERY_KEY_FILE` を書くようにしました (従来は鍵の有無に関係なく書いていました)。
実体の無いパスが `env` に残っていると ADC がユーザー認証へフォールバックできません。

### Fixed
- entrypoint の symlink 生成で、**入れ子パスの親ディレクトリが作られていなかった**不具合を
直しました。`~/.claude/.credentials.json` は永続領域側の作成が
`No such file or directory` で落ちて壊れた symlink になり、`~/.claude/history.jsonl` は
ファイル判定が `*.json` グロブだったため `.jsonl` にマッチせず**ディレクトリとして**
作られ、Claude Code が追記できませんでした。ファイルとして作るエントリは拡張子ではなく
明示の一覧で判定するようにしています。

- **`plugin.yml` の `requires.devbase` をインストール時に検証**するようにしました。要件を
満たさない Plugin は `devbase plugin install` が中止します。これまでは値を読むだけで
比較しておらず、`project.yml` 形式の Plugin を 2.x へ入れられてしまい、`devbase up` の
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ devbaseは、Docker Composeを使った再現性の高い開発環境を提供
- **豊富なツールセット**: Docker CLI、AWS CLI、gcloud SDK、Terraform、Node.js、AI CLIツールがプリインストール
- **複数コンテナの並行開発**: `devbase project scale`で既存コンテナを再起動せずにスケール可能
- **データ永続化**: 名前付きボリュームでコンテナ再起動後もデータを保持
- **スナップショット管理**: 共通ボリューム `devbase_home_ubuntu`(コンテナ内 `/persistent/ai`。AI 設定・共有ファイル)の増分バックアップ・復元・世代管理
- **アカウントグループ**: 認証情報と会話ログを `DEVBASE_ACCOUNT_GROUP` 単位のボリュームへ分離(共通資産は重複させない)
- **スナップショット管理**: 共通ボリューム `devbase_home_ubuntu`(`/persistent/ai`)とグループボリューム `devbase_home_<group>`(`/persistent/group`)の増分バックアップ・復元・世代管理
- **環境変数の自動収集**: `devbase env init`でAWS/Git/GCP認証情報を対話的に設定
- **階層メニュー TUI**: `devbase list` のプロジェクト一覧(矢印キー移動・名前絞り込み対応)から起動・操作(up / down / login / ps / logs / scale / build / rebuild)を選択。画面最下部の常設メニュー(環境変数 / プラグイン / スナップショット / ステータス)へは ←→ キーで移動できます
- **イメージ再ビルド**: `devbase build [name] --no-cache` でキャッシュ無効の完全再ビルド。`devbase rebuild [name]`(= `build --expires=7`)はイメージが既定 7 日より古いときのみ再ビルドします
Expand Down Expand Up @@ -148,6 +149,7 @@ devbaseのコマンドは4つのグループにまとめられています。
| [環境変数ガイド](docs/user/environment-variables.md) | 3レベル構造、コレクター、ソース同期 |
| [環境変数の export/import ガイド](docs/user/env-export-import.md) | バンドル形式・age 暗号化・S3 連携・merge/replace の運用 |
| [コンテナ操作ガイド](docs/user/container-operations.md) | ライフサイクル、並行開発、ボリューム構造 |
| [Google 認証ガイド](docs/user/google-auth.md) | アカウントグループごとの gcloud / gws 認証、`GCP_AUTH_MODE` |
| [スナップショットガイド](docs/user/snapshot-guide.md) | 増分バックアップ、世代管理、復元手順 |
| [トラブルシューティング](docs/user/troubleshooting.md) | カテゴリ別の問題と解決策 |
| [Orca 削除の移行ガイド](docs/user/orca-removal-migration.md) | 旧 Orca(SSH) 接続の廃止と Remote-SSH への移行手順 |
Expand Down
2 changes: 1 addition & 1 deletion containers/base/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ RUN set -eux; \
curl -LsSf https://astral.sh/uv/install.sh | sh; \
# npm グローバルパッケージ(umask 0002 で npm グループにも書き込み権を残す)
umask 0002; \
npm i -g yarn @playwright/test aws-cdk aws-cdk-lib typescript @google/gemini-cli @openai/codex; \
npm i -g yarn @playwright/test aws-cdk aws-cdk-lib typescript @google/gemini-cli @openai/codex @googleworkspace/cli; \
# root が作ったファイルも ubuntu が上書きできるように揃える。
# install レイヤーと同じ RUN なのでレイヤーの複製は発生しない。
chown -R "$USERNAME":npm "$NPM_CONFIG_PREFIX"; \
Expand Down
Loading
Loading