Files
codex-app-server/deploy/provision_codexsvc_key.sh
T
host 1ff8906aee 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 项)。
2026-10-30 01:39:46 +08:00

56 lines
2.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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