feat(repos): 仓库接入预检 + codexsvc deploy key 配给脚本
本机 https 到 GitHub 常被出口策略挡、ssh 才通(2026-10-30 实测),而新项目填 https 私有仓会在 worker 里花几分钟超时 才失败。控制面不存仓库凭证的设计不动,缺的是建项目前的 快速预检与按仓库通用化的配 key 流程: - cloud.repos.check_repo_access:只跑 git ls-remote HEAD, 不 clone、不写盘、不改库;失败返回 (False, 原因),https 失败时追加改走 git@ 形的提示;CLI python3 -m cloud.repos check <url>,退出码 0/1,只打印结果与原因。 - deploy/provision_codexsvc_key.sh:主机上以 root 跑,为 codexsvc 生成/复用 ed25519 key(绝不覆盖已有 key),只 打印公钥(私钥绝不打印),--check 时以 codexsvc 身份跑 ls-remote,通了才算配好。 - 内层沙箱边界诚实说明:Docker 任务内层本就是 danger-full-access(见 sandbox.py 注释),外层 Docker/gVisor 才是防线;宿主级 bwrap workspace-write 的 fresh proc 在嵌套 pidns 下是内核 EPERM、/tmp 不隔离——这些是上游 codex 二进制 与内核的边界,本批不谎称在仓库代码里修掉,只把仓库接入 这一档做成可重复流程。 单测:test_project_repo 20 项全过(新增 check 5 项)。
This commit is contained in:
1 parent
b306b56517
commit
1ff8906aee
3 files changed
+173
-2
No files matched your search
Executable
+55
@@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
# 给 codexsvc 配一只读 deploy key(按仓库通用化,控制面不存凭证)。
|
||||
#
|
||||
# 用法(主机上以 root 跑):
|
||||
# ./provision_codexsvc_key.sh git@github.com:ORG/REPO.git [key-name]
|
||||
# ./provision_codexsvc_key.sh --check git@github.com:ORG/REPO.git [key-name]
|
||||
#
|
||||
# 流程:
|
||||
# 1. 在 /home/codexsvc/.ssh/ 生成 ed25519 key(已存在则复用,绝不覆盖);
|
||||
# 2. 打印公钥(只打印公钥,私钥绝不打印),请把公钥以只读 deploy key
|
||||
# 加到 GitHub 仓库 Settings -> Deploy keys;
|
||||
# 3. --check 时以 codexsvc 身份跑 git ls-remote,通了才算配好。
|
||||
# 4. 另有现成的 key 要复用时,把 key 文件拷到上述目录并 chown
|
||||
# codexsvc、chmod 600,再用 --check 验,不要改本脚本去读 root 的 key。
|
||||
#
|
||||
# 安全边界:本脚本不往控制面、环境文件或任何日志里写私钥;公钥
|
||||
# 本来就是公开的,打印它没有风险;key 名只允许 [A-Za-z0-9_-]。
|
||||
set -eu
|
||||
CHECK=0
|
||||
if [ "${1:-}" = "--check" ]; then
|
||||
CHECK=1; shift
|
||||
fi
|
||||
URL="${1:-}"
|
||||
NAME="${2:-codex-github}"
|
||||
if [ -z "$URL" ]; then
|
||||
echo "用法: $0 [--check] git@github.com:ORG/REPO.git [key-name]" >&2
|
||||
exit 2
|
||||
fi
|
||||
case "$URL" in
|
||||
git@github.com:*:*.git) ;;
|
||||
*) echo "只接受 git@github.com:ORG/REPO.git 形(https 形在本机常被出口策略挡)" >&2; exit 2 ;;
|
||||
esac
|
||||
case "$NAME" in
|
||||
*[!A-Za-z0-9_-]*) echo "key 名只允许字母数字 _ -" >&2; exit 2 ;;
|
||||
esac
|
||||
SSH_DIR=/home/codexsvc/.ssh
|
||||
KEY="$SSH_DIR/id_$NAME"
|
||||
mkdir -p "$SSH_DIR"
|
||||
chown codexsvc:codexsvc "$SSH_DIR"
|
||||
chmod 700 "$SSH_DIR"
|
||||
if [ ! -f "$KEY" ]; then
|
||||
sudo -u codexsvc ssh-keygen -t ed25519 -f "$KEY" -N "" -C "codexsvc-$NAME"
|
||||
chmod 600 "$KEY"
|
||||
chown codexsvc:codexsvc "$KEY"
|
||||
fi
|
||||
chmod 600 "$KEY" 2>/dev/null || true
|
||||
chown codexsvc:codexsvc "$KEY" "$KEY.pub" 2>/dev/null || true
|
||||
echo "公钥(加到 GitHub 仓库的只读 Deploy keys):"
|
||||
cat "$KEY.pub"
|
||||
if [ "$CHECK" = "1" ]; then
|
||||
echo "以 codexsvc 身份预检 git ls-remote ..."
|
||||
sudo -u codexsvc env GIT_SSH_COMMAND="ssh -i $KEY -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new" \
|
||||
git ls-remote "$URL" HEAD
|
||||
echo "预检通过:codexsvc 能读该仓库"
|
||||
fi
|
||||
Reference in new issue
Block a user