From a12fe9dfdcddb63b87aefefc238c72f3ae6d3611 Mon Sep 17 00:00:00 2001 From: "takemi.ohama" Date: Tue, 14 Jul 2026 08:59:18 +0900 Subject: [PATCH 1/2] =?UTF-8?q?chore:=20PLAN33-base-sshd=20Draft=20PR=20?= =?UTF-8?q?=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From fa3fc9869b8060575afe873a1165406cde61d5bf Mon Sep 17 00:00:00 2001 From: "takemi.ohama" Date: Tue, 14 Jul 2026 09:03:03 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat(base):=20openssh-server=20=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=A8=20ENABLE=5FSSH=20=E3=81=AB=E3=82=88=E3=82=8B?= =?UTF-8?q?=20sshd=20=E8=B5=B7=E5=8B=95=20(PLAN33=20PR1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- containers/base/Dockerfile | 7 ++++++ containers/base/entrypoint.sh | 36 +++++++++++++++++++++++++++++++ docs/user/container-operations.md | 9 ++++++++ 3 files changed, 52 insertions(+) diff --git a/containers/base/Dockerfile b/containers/base/Dockerfile index 4d70183..8078ec4 100644 --- a/containers/base/Dockerfile +++ b/containers/base/Dockerfile @@ -13,6 +13,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ apt-get update; \ apt-get install -y --no-install-recommends \ locales git wget vim sudo nano jq make unzip \ + openssh-server \ curl ca-certificates gnupg lsb-release \ libnss3 libxrandr2 libxss1 \ fonts-noto-cjk fonts-noto-cjk-extra; \ @@ -123,6 +124,12 @@ RUN groupadd -f users; \ echo "$USERNAME ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$USERNAME; \ chmod 0440 /etc/sudoers.d/users /etc/sudoers.d/$USERNAME +# sshd 設定(Orca 向け: 公開鍵認証のみ・Password 無効・TcpForwarding 有効) +RUN set -eux; \ + mkdir -p /run/sshd /etc/ssh/sshd_config.d; \ + printf 'PasswordAuthentication no\nPubkeyAuthentication yes\nAllowTcpForwarding yes\nX11Forwarding no\nPermitRootLogin no\n' \ + > /etc/ssh/sshd_config.d/10-devbase-orca.conf + USER ${USERNAME} WORKDIR /tmp diff --git a/containers/base/entrypoint.sh b/containers/base/entrypoint.sh index 77db99e..24672b9 100644 --- a/containers/base/entrypoint.sh +++ b/containers/base/entrypoint.sh @@ -261,6 +261,42 @@ done echo "AI agent settings symlinks setup completed" # ======================================== +# ======================================== +# SSH server (Orca 連携) — enabled by ENABLE_SSH=true +# ======================================== +# NOTE: ~/.ssh は上の symlink setup で /persistent/ai/.ssh に張り替え済みのため、 +# authorized_keys の書き込みはこのブロック(symlink 生成後)で行う必要がある。 +if [ "$ENABLE_SSH" = "true" ] || [ "$ENABLE_SSH" = "1" ]; then + echo "Starting sshd for Orca..." + + # host key を永続領域から復元、無ければ生成して保存する。 + # 再ビルド/再作成で host key が変わると Orca 側 known_hosts が壊れるのを防ぐ。 + # HOST_KEY_DIR は .ssh symlink とは別の独立ディレクトリ(ドット無し)。 + HOST_KEY_DIR="/persistent/ai/ssh" + sudo mkdir -p "$HOST_KEY_DIR" || true + if ! sudo ls "$HOST_KEY_DIR"/ssh_host_*_key >/dev/null 2>&1; then + echo "Generating new sshd host keys..." + sudo ssh-keygen -A + sudo cp /etc/ssh/ssh_host_*_key* "$HOST_KEY_DIR"/ 2>/dev/null || true + fi + # 永続領域から /etc/ssh へ復元(毎回) + sudo cp "$HOST_KEY_DIR"/ssh_host_*_key* /etc/ssh/ 2>/dev/null || true + + # authorized_keys の展開(.ssh は /persistent/ai/.ssh へ symlink 済み) + if [ -n "$SSH_AUTHORIZED_KEYS" ]; then + mkdir -p ~/.ssh && chmod 700 ~/.ssh + printf '%s\n' "$SSH_AUTHORIZED_KEYS" > ~/.ssh/authorized_keys + chmod 600 ~/.ssh/authorized_keys + echo "authorized_keys installed" + else + echo "Warning: SSH_AUTHORIZED_KEYS is empty; public-key login will not work" + fi + + # sshd 起動(daemonize するため exec "$@" をブロックしない) + sudo /usr/sbin/sshd -e + echo "sshd started" +fi + # Git operations (optional, don't fail if they error) if [ -n "$GIT_USER" ] && [ -n "$GIT_REPO" ]; then # Clone repository only if it doesn't exist diff --git a/docs/user/container-operations.md b/docs/user/container-operations.md index c5b1838..b6469d0 100644 --- a/docs/user/container-operations.md +++ b/docs/user/container-operations.md @@ -218,6 +218,15 @@ graph TD | **go** | base | Go 開発環境 | Go 開発 | | **snapshot** | Ubuntu Noble | zstd のみ(約 80MB) | スナップショット専用 | +### SSH サーバー(Orca 連携) + +base イメージには `openssh-server` が含まれます。環境変数 `ENABLE_SSH=true`(または `1`)を指定してコンテナを起動すると、entrypoint が sshd を起動します(既定は無効)。 + +- 認証は公開鍵のみ(`SSH_AUTHORIZED_KEYS` に手元の公開鍵を設定)。 +- host key は `/persistent/ai/ssh/` に永続化され、再ビルド/再作成後も維持されます(Orca の known_hosts が壊れない)。 + +> **Note:** `openssh-server` の追加は base イメージの変更のため、既存イメージには `devbase build --no-cache`(base 再ビルド)が必要です。 + ### AI CLI エイリアス general イメージ以降のコンテナ内では、以下の AI CLI ツールがエイリアスとして利用可能です。