feat: PLAN33-base-sshd base に openssh-server + sshd 起動#82
Merged
Conversation
12 tasks
Orca 連携のため base イメージを SSH target 化する。 - containers/base/Dockerfile: 最初の apt-get に openssh-server を追加。 root のうちに /run/sshd と /etc/ssh/sshd_config.d/10-devbase-orca.conf (公開鍵認証のみ・Password 無効・TcpForwarding 有効)を作成。 - containers/base/entrypoint.sh: ENABLE_SSH=true/1 で sshd を起動する ブロックを追加。AI 設定 symlink 生成後(~/.ssh が /persistent/ai/.ssh へ張り替え済み)かつ exec "$@" 前に配置。host key を /persistent/ai/ssh に永続化・復元し、SSH_AUTHORIZED_KEYS を authorized_keys へ展開。 - docs/user/container-operations.md: openssh-server 同梱と ENABLE_SSH、 host key 永続化、base 変更に build --no-cache が要る旨を追記。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
takemi-ohama
marked this pull request as ready for review
July 14, 2026 00:09
takemi-ohama
added a commit
that referenced
this pull request
Jul 14, 2026
* chore: release/PLAN33 Draft PR 作成 * feat: PLAN33-port-publish コンテナ SSH ポートの publish (#83) * chore: PLAN33-port-publish Draft PR 作成 * feat(compose): ENABLE_SSH 時に SSH ポートを決定的に publish (PLAN33 PR2) Orca からコンテナへ SSH 接続できるよう、ENABLE_SSH=true のとき generate_scaled_compose が各 dev-<index> サービスへ <bind>:<port>:22 を publish する。 - env/keys.py: ENABLE_SSH / DEVBASE_SSH_BIND / DEVBASE_SSH_PORT_BASE を追加 - volume/ports.py (新規): sha1 ベースの安定ハッシュで (project, index) → host port を決定的に算出 (down→up を跨いで一定) - volume/compose.py: project_name を _build_scaled_services / _build_dev_instance へ通し、ENABLE_SSH 有効時のみ ports を注入 - tests/volume/test_compose_ssh_ports.py (新規): 有効/無効・bind・base・ 決定性・衝突回避の単体テスト Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: PLAN33-base-sshd base に openssh-server + sshd 起動 (#82) * chore: PLAN33-base-sshd Draft PR 作成 * feat(base): openssh-server 追加と ENABLE_SSH による sshd 起動 (PLAN33 PR1) Orca 連携のため base イメージを SSH target 化する。 - containers/base/Dockerfile: 最初の apt-get に openssh-server を追加。 root のうちに /run/sshd と /etc/ssh/sshd_config.d/10-devbase-orca.conf (公開鍵認証のみ・Password 無効・TcpForwarding 有効)を作成。 - containers/base/entrypoint.sh: ENABLE_SSH=true/1 で sshd を起動する ブロックを追加。AI 設定 symlink 生成後(~/.ssh が /persistent/ai/.ssh へ張り替え済み)かつ exec "$@" 前に配置。host key を /persistent/ai/ssh に永続化・復元し、SSH_AUTHORIZED_KEYS を authorized_keys へ展開。 - docs/user/container-operations.md: openssh-server 同梱と ENABLE_SSH、 host key 永続化、base 変更に build --no-cache が要る旨を追記。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: PLAN33-docs Orca 接続ガイド (#85) * chore: PLAN33-docs Draft PR 作成 * docs: Orca 接続ガイドを追加し README/docs 索引に導線を追記 コンテナ内 sshd を publish して Orca の SSH target として接続する エンドツーエンドの手順を docs/user/orca.md に追加。base 再ビルド → env init(公開鍵)→ ENABLE_SSH で up → devbase orca sync → Orca への import → worktree 作成までを網羅。macOS 直結 / Windows→macOS(SSH トンネル・Tailscale)の 2 パターン、環境変数一覧、 隔離設計、Ports tab、トラブルシュート(docker exec/ProxyCommand を 採らない理由・host key 永続化)を記載。README.md と docs/README.md の 機能一覧・ドキュメント索引に導線を追記。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat(orca): ホスト側 Orca 隔離 SSH config 生成 + up/down 連携 (PLAN33 PR3) (#84) Orca からコンテナへ SSH 接続するための、ホスト側の隔離 SSH config 生成と `devbase orca` コマンド、up/down フックを追加する。 - `devbase orca sync/prune/status`: 稼働中の SSH publish 済みコンテナを docker inspect で列挙し (コンテナ名の dash split はせず compose ラベルと 22/tcp publish で判定)、`~/.config/devbase/orca/ssh_config` を全再生成する。 他ホストを一切書かないため Orca への import で隔離が成立する。 - up 完了後に ENABLE_SSH 有効時のみ orca sync、down 後に orca prune を best-effort で呼ぶ (失敗しても up/down の戻り値は変えない)。 - collectors/orca.py: laptop の公開鍵を SSH_AUTHORIZED_KEYS として、 HostName 用 DEVBASE_ORCA_HOSTNAME を env init で収集する。 - keys.py に SSH_AUTHORIZED_KEYS / DEVBASE_ORCA_HOSTNAME を追加。 - cli.py / bin/devbase に orca サブコマンドを配線。 - tests/commands/test_orca.py: レンダリング・隔離・prune・列挙の単体テスト (実 docker は呼ばず fake targets / サンプル JSON を注入)。 Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(plan): PLAN33 Orca 対応の設計 plan と元 issue を追加 release ブランチが self-documenting になるよう、実装の設計根拠 (PR 分割計画・ 設計判断・E2E テスト計画) と元 issue / アドバイスを issues/ 配下に追加する。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(orca): codex レビュー指摘 4 件に対応 (PR #81 round 1) - 隔離: dev コンテナへ dev.devbase.ssh ラベルを付与し、_parse_inspect の 必須条件に追加。22/tcp を publish する他 Compose プロジェクトの混入を防ぐ。 - ポート衝突: allocate_ssh_host_port を追加し、決定的ポートを優先しつつ 同一生成内 + 他プロジェクト稼働 publish (best-effort docker 照会) と衝突する 場合は線形探索で回避。決定性は衝突が無い限り保つ。 - docs: env init が収集するのは Mac の公開鍵である点を明記し、Windows の Orca では Windows の公開鍵を SSH_AUTHORIZED_KEYS に登録する手順・複数鍵対応・ IdentityFile の対応関係を追記。 - エラーハンドリング: _running_ssh_targets が列挙失敗時に None を返し、 regenerate_config は OrcaEnumerationError を送出して既存 config を保持。 sync/prune CLI は非ゼロ終了、up/down フックは warning のみ。 tests: 889 passed (+10) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(orca): scale のポート衝突誤判定/Orca同期漏れ/IdentityFile固定を修正 (PR #81 round 2) cross-review round 2 の指摘 3 件に対応。 A [major/正確性] SSH ポート衝突回避が自プロジェクトの稼働ポートまで数え、 devbase scale で既存 dev-1..N の決定的ポートが +1 ずれて --no-recreate と 不整合になる問題を修正。_running_published_host_ports に exclude_project 引数を 追加し com.docker.compose.project ラベルで自プロジェクトを除外。up/scale の 呼び出し側から現在の project_name を渡す。 B [major/状態同期] cmd_scale がスケールアウト後に Orca config を再生成せず、 追加インスタンスが手動 sync まで現れない問題を修正。up 経路同様に成功時 best-effort で _maybe_orca_sync() を呼ぶ。 C [minor/UX] 生成 config の IdentityFile を ~/.ssh/id_ed25519 固定にしていたため id_rsa のみのユーザーで不一致警告が出る問題を修正。IdentityFile 行を出力せず SSH クライアント/Orca の既定鍵解決に委ねる。docs/user/orca.md も追随。 テスト: A の自プロジェクト除外/他プロジェクト衝突と C の IdentityFile 非出力を追加。 uv run pytest tests/ -q は 895 passed。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(orca): sshd host key を install ごとに一意生成 + 命名/型注釈の整合 (round 3) クロスレビュー round 3 の指摘 3 件に対応。 - [major/security] entrypoint.sh: openssh-server がビルド時に生成する /etc/ssh/ssh_host_*_key を初回起動時に破棄してから ssh-keygen -A で再生成し、 イメージ由来の予測可能な共通 host key が全 install で共有される問題を修正。 生成/復元+永続化を flock で直列化し、同一ボリューム共有時の競合 (TOCTOU) を回避。 - [minor] compose._running_published_host_ports を public 名 get_running_published_host_ports へ改名 (定義/import/呼出/テスト全箇所)。 - [minor] cmd_orca の targets_provider 型注釈を Optional[Callable[[], Optional[List[SSHTarget]]]] へ修正 (None 返却に整合)。 - docs: host key が install ごとに一意生成される旨を追記 (orca.md / container-operations.md)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(orca): scale>=2 の Host 衝突 / 鍵失効 / User 誤設定を修正 (round4) クロスレビュー round4 の major 指摘 3 件に対応。 1. [correctness] scale>=2 で Orca Host が衝突する問題を修正。 generate_scaled_compose は dev-1..N を別サービスとして展開するため compose の container-number が全て 1 になり、index が全 target で 1 に 潰れて Host devbase-<project>-1 が衝突していた。SSH publish 時に dev.devbase.index ラベルを付与し、_parse_inspect はこのラベルから index を読む (未設定時は container-number へフォールバック)。 2. [security] SSH_AUTHORIZED_KEYS を空にしても失効鍵で login できる問題を修正。 ~/.ssh は永続ストレージへの symlink のため、env を空にしても前回の authorized_keys が残っていた。空のときは rm -f で永続鍵を削除して失効を反映する。 3. [correctness] User にホストの USERNAME を使うと SSH 失敗する問題を修正。 Windows 上の Orca ホストでは USERNAME が Windows アカウント名になるが コンテナのログインユーザーは常に ubuntu。ambient な USERNAME は読まず ubuntu を既定とし、上書きは devbase 専用の DEVBASE_ORCA_USER のみに限定する。 keys.py に DEVBASE_ORCA_USER を追加し docs/user/orca.md にも記載。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(orca): User の per-target 化 / stale 剪定 / SSH_PORT_BASE 検証 (round5) - cross-project sync が全エントリへ実行プロジェクトの User を一律適用し、 container user の異なる別プロジェクトのエントリがログイン不能になる問題を修正。 compose 生成時に dev.devbase.user ラベルへ各プロジェクト自身の解決済みユーザーを 焼き込み、_parse_inspect が per-target で読み取って SSHTarget.user に持たせる。 _render_config はエントリ毎に User を出力する。 - ENABLE_SSH を true→false に切り替えて再 up した際、停止したコンテナのエントリが Orca config に残る問題を修正。_maybe_orca_sync を「SSH 有効 または config 既存」で 再生成するよう変更。config 未作成の純粋な非 Orca ユーザーでは従来どおり何もしない (無用なファイル生成を避ける)。orca.config_exists() を追加。 - DEVBASE_SSH_PORT_BASE が非整数だと up が stacktrace で落ちる問題を修正。 int 変換を try/except で握り DockerError に変換 (変数名と値を明示)。確保後の ホストポートが 1..65535 を超える場合も DockerError にする。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(orca): _maybe_orca_prune を config_exists() でゲート (round6) down 後の Orca SSH config 剪定が regenerate_config() を無条件に呼んでいたため、 Orca/SSH を一切使わないユーザーの devbase down でも毎回 ~/.config/devbase/orca/ ssh_config (親ディレクトリ + ヘッダ) が新規生成されていた。round5 で _maybe_orca_sync に追加した config_exists() ゲートと同じ扱いにし、config が 既に存在するときのみ剪定するよう修正する。剪定ゲートの test を 3 件追加。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(orca): SSH_AUTHORIZED_KEYS プロンプトの公開鍵を短縮表示 公開鍵は数百文字・複数行になり得るため、そのまま safe_input の プロンプトへ埋め込むとターミナル表示が崩れる。鍵種別と末尾数文字 + (設定済み) の短縮表示に変更。Enter で維持される既定値 (default 引数) はフル鍵のままで、保存値のセマンティクスは不変。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Test plan
base イメージ変更のため反映には base 再ビルドが必須(
devbase upでは反映されない)。devbase build --no-cacheで openssh-server 入りの base/general イメージが生成されるENABLE_SSH=trueかつSSH_AUTHORIZED_KEYS=<公開鍵>でdevbase up後、ssh -p <port> ubuntu@127.0.0.1 'whoami; git --version'が公開鍵認証で通るsshd_config.d/10-devbase-orca.confの設定が有効(パスワード認証拒否・PermitRootLogin no)/persistent/ai/ssh/に host key が保存され、再ビルド/再作成後も同一 host key で接続でき known_hosts 警告が出ないENABLE_SSH未設定時は sshd が起動しない(既定無効)