feat: credentials 認証モードとトークン自動リフレッシュ CronJob を追加 (v2.1.263-b)
トークンが定期的に失効・ローテーションしても再デプロイ不要にする。 - anthropic.authMode: credentials(新既定) ~/.claude/.credentials.json 全体(refreshToken 込み)を Secret に格納。 セッション Pod にはファイルとしてマウントし $HOME/.claude へコピー(書き込み可)、 セッション内 claude が refreshToken で自己更新 - anthropic.refresher CronJob(credentials 時・既定有効, files/token-refresher.py) Secret 内 refreshToken で OAuth トークンを更新し Secret を書き戻す。 専用 SA + resourceNames 限定 Role で該当 Secret の get/patch のみ。 tokenUrl/clientId は Claude Code CLI の非公式値(values 上書き可) - manager.py build_pod: credentials は envFrom を使わずファイルマウント + SEED_CREDENTIALS_FILE。apiKey/oauth は従来どおり envFrom - Secret に helm.sh/resource-policy: keep(credentials 時)で refresher の書込を保持 - fix: values.schema.json の $schema 行を削除(一部の Helm で "no schema with key or ref https://json-schema.org/draft-07/schema#" エラー) - helm lint / template(credentials/apiKey/oauth)検証済み
This commit is contained in:
+23
-1
@@ -54,6 +54,8 @@ SESSION_IMAGE_PULL_POLICY = env("SESSION_IMAGE_PULL_POLICY", "IfNotPresent")
|
||||
SESSION_IMAGE_PULL_SECRETS = env_json("SESSION_IMAGE_PULL_SECRETS_JSON", [])
|
||||
BOOTSTRAP_CM = env("SESSION_BOOTSTRAP_CONFIGMAP", FULLNAME + "-session")
|
||||
ANTHROPIC_SECRET = env("ANTHROPIC_SECRET", FULLNAME + "-anthropic")
|
||||
ANTHROPIC_AUTH_MODE = env("ANTHROPIC_AUTH_MODE", "apiKey")
|
||||
ANTHROPIC_CREDENTIALS_KEY = env("ANTHROPIC_CREDENTIALS_KEY", ".credentials.json")
|
||||
GIT_IDENTITIES = env_json("GIT_IDENTITIES_JSON", {})
|
||||
GIT_ALLOWED_HOSTS = [h.strip().lower() for h in env("GIT_ALLOWED_HOSTS", "").split(",") if h.strip()]
|
||||
GIT_ALLOW_ARBITRARY = env("GIT_ALLOW_ARBITRARY", "false").lower() == "true"
|
||||
@@ -249,13 +251,33 @@ def build_pod(sid, repo, ref, identity_name, owner):
|
||||
mounts.append({"name": "git-identity", "mountPath": "/git-identity", "readOnly": True})
|
||||
env_list.append({"name": "GIT_HTTPS_USERNAME", "value": ident.get("username", "x-access-token")})
|
||||
|
||||
# ---- Claude 認証情報の渡し方 ----
|
||||
# credentials モード: Secret をファイルとしてマウントし、エントリポイントが
|
||||
# $HOME/.claude/.credentials.json へコピーする(書き込み可能にして claude 自身の
|
||||
# リフレッシュを許す)。env var 名に "." を含められないため envFrom は使わない。
|
||||
# apiKey / oauth モード: 有効な env var 名なので envFrom でそのまま注入する。
|
||||
env_from = []
|
||||
if ANTHROPIC_AUTH_MODE == "credentials":
|
||||
volumes.append({
|
||||
"name": "anthropic-creds",
|
||||
"secret": {
|
||||
"secretName": ANTHROPIC_SECRET,
|
||||
"defaultMode": 0o400,
|
||||
"items": [{"key": ANTHROPIC_CREDENTIALS_KEY, "path": "credentials.json"}],
|
||||
},
|
||||
})
|
||||
mounts.append({"name": "anthropic-creds", "mountPath": "/anthropic", "readOnly": True})
|
||||
env_list.append({"name": "SEED_CREDENTIALS_FILE", "value": "/anthropic/credentials.json"})
|
||||
else:
|
||||
env_from = [{"secretRef": {"name": ANTHROPIC_SECRET}}]
|
||||
|
||||
container = {
|
||||
"name": "claude",
|
||||
"image": SESSION_IMAGE,
|
||||
"imagePullPolicy": SESSION_IMAGE_PULL_POLICY,
|
||||
"command": ["/bin/sh", "/bootstrap/entrypoint.sh"],
|
||||
"env": env_list,
|
||||
"envFrom": [{"secretRef": {"name": ANTHROPIC_SECRET}}],
|
||||
"envFrom": env_from,
|
||||
"ports": [{"name": "ttyd", "containerPort": TTYD_PORT}],
|
||||
"volumeMounts": mounts,
|
||||
"resources": SESSION_RESOURCES,
|
||||
|
||||
Reference in New Issue
Block a user