[FR] Support file-based and Azure Key Vault token sources alongside env and googleCloudSecret
維護者通常 1 天內回覆
還沒有人認領這個 Issue。
- #1705 來自 @simmi-tdh —— 已關閉,未合併
評估
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 新手友好度
- 64/100
- Issue 類型
- 功能
- 描述清晰度
- 描述清楚
- 活躍度
- 活躍
- 技術堆疊
- azure, typescript
研究方向
Start with schemas/v3/shared.json and packages/shared/src/crypto.ts:124-149, then inspect the existing env and googleCloudSecret handling. Update the schema, regenerated schemas, implementation, unit tests, and docs/docs/configuration/config-file.mdx for both file and Azure Key Vault sources. Done means both configurations validate, missing or empty files fail clearly, and values are resolved on each use.
由索引模型根據 Issue 內容生成。
描述
Describe the feature you'd like
Add two new token sources alongside env and googleCloudSecret: a file source and an
Azure Key Vault source.
{ "token": { "file": "/var/run/secrets/sourcebot/github-token" } }
{ "token": { "azureKeyVaultSecret": "https://<vault>.vault.azure.net/secrets/<name>[/<version>]" } }
Motivation
A Token in the config can only come from an environment variable or from Google Cloud
Secret Manager. schemas/v3/shared.json defines exactly two shapes, { "env": ... } and
{ "googleCloudSecret": ... }, and getTokenFromConfig throws Invalid token configuration
for anything else (packages/shared/src/crypto.ts:124-149).
That makes short-lived credentials impractical outside GCP. GitHub App installation tokens
(ghs_, accepted as connection tokens once #1662 lands) expire after one hour. Environment
variables are fixed when the container starts, so the only way to hand Sourcebot a fresh
token is to restart the whole service every hour. That restart takes the web app down and
interrupts in-flight indexing.
The rest of the code already supports rotation. Nothing caches the resolved value:
getGitHubReposFromConfig calls getTokenFromConfig on every sync
(packages/backend/src/github.ts:172), and getRepoAuth calls it on every clone and fetch
(packages/backend/src/utils.ts:167). A source whose value can change at runtime would be
picked up on the next sync with no other changes. Only the source types are missing.
Note - this is not specific to GitHub. Token is shared, so connection tokens, SSO client
secrets, LLM API keys and environmentOverrides values (DATABASE_URL, REDIS_URL) have the
same limit. On Azure there is currently no supported way to keep any of them in Key Vault.
Proposed design
Both are additive anyOf branches in Token, so existing configs are unaffected.
1. file (no new dependencies)
{ "token": { "file": "/var/run/secrets/sourcebot/github-token" } }
- Read the file each time the token is resolved and trim whitespace, matching
envand
googleCloudSecret. Fail with a clear error if it is missing or empty. - Works on any platform: Kubernetes Secret volumes (refreshed in place), Docker/Compose
secrets, the Secrets Store CSI driver for Azure Key Vault/AWS/Vault, and sidecars that mint
tokens, such as a GitHub App token refresher writing to a sharedemptyDir. - On its own, this solves the rotation problem above.
2. azureKeyVaultSecret
{ "token": { "azureKeyVaultSecret": "https://<vault>.vault.azure.net/secrets/<name>" } }
{ "token": { "azureKeyVaultSecret": "https://<vault>.vault.azure.net/secrets/<name>/<version>" } }
- Uses
@azure/keyvault-secretswithDefaultAzureCredential(@azure/identity), covering
AKS Workload Identity, managed identity andAZURE_CLIENT_*environment variables. This
mirrors how the GCP source relies on Application Default Credentials. - Leaving out the version fetches the latest one, so rotating the secret in Key Vault is
enough.
Example use case
- Register a GitHub App, install it on an organisation, grant
Contents: readand
Metadata: read. - Run a sidecar (or CronJob) that mints an installation token every ~50 minutes via
POST /app/installations/{installation_id}/access_tokensand writes it to a shared volume. - Point the connector at that file:
{ "type": "github", "token": { "file": "/var/run/secrets/github-token" }, "orgs": ["my-org"] } - Sourcebot reads the current token on every sync, clone and fetch. No restarts.
Today, step 3 is rejected by schema validation at startup, and the env equivalent stops
working with 401 Bad credentials after an hour.
Alternatives considered
- Restarting the container every hour: causes downtime and interrupts indexing.
- The native
appsGitHub App integration: requires a license key, and itsprivateKey
is itself aToken(schemas/v3/app.json), so on Azure the App's private key still has to
sit in an environment variable. - Going through GCP Secret Manager: brings a second cloud into an Azure-only deployment.
Additional information
Sourcebot version: v5.1.12 (docker.sourcebot.dev/sourcebot-dev/sourcebot), also applies to
main at the time of writing. Running on AKS (Azure); no GCP.
I'm happy to send the PR: schemas/v3/shared.json (plus regenerated schemas and docs),
getTokenFromConfig, unit tests, and the Tokens section of
docs/docs/configuration/config-file.mdx. If you'd prefer it smaller, I can send file
first and Azure Key Vault in a follow-up.
- 主要語言
- TypeScript
- 星號
- 3.9k
- 分支
- 374
- 平均合併
- 2 天 21 小時
- 30 天內合併 PR
- 43
環境準備
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
sourcebot-dev/sourcebot 的其他 Issue
-
[bug] Search result hydration performs duplicate repository lookups within the same chunk可能重新可做 @Abhishek-Sonje 於 21 天前認領,目前沒有進行中的 PR。 未關閉bug triage needed
難度 2/5 1-3 小時 新手友好度 84/100
sourcebot-dev/sourcebot#1681 · 1 則留言 ·
維護者通常 1 天內回覆
-
Linux ctags build instructions in CONTRIBUTING.md are missing build dependencies可能重新可做 關聯的 PR 已關閉且未合併。 未關閉
難度 2/5 1-3 小時 新手友好度 84/100
sourcebot-dev/sourcebot#1633 ·
維護者通常 1 天內回覆
-
MCP ask_codebase rejects explicit languageModel: getLanguageModelKey includes displayName which the MCP schema doesn't expose可能重新可做 @Harsh23Kashyap 於 103 天前認領,目前沒有進行中的 PR。 未關閉ask_sb bug
難度 2/5 1-3 小時 新手友好度 76/100
sourcebot-dev/sourcebot#1137 · 4 則留言 ·
維護者通常 1 天內回覆
-
[bug] Local repositories with a space or non-ASCII character in the path cannot be indexed可能重新可做 關聯的 PR 已關閉且未合併。 未關閉
難度 2/5 1-3 小時 新手友好度 35/100
sourcebot-dev/sourcebot#1689 ·
維護者通常 1 天內回覆
-
[bug] Escaped quotes in a quoted keyword search are searched with the backslashes可能重新可做 關聯的 PR 已關閉且未合併。 未關閉
難度 2/5 1-3 小時 新手友好度 35/100
sourcebot-dev/sourcebot#1687 ·
維護者通常 1 天內回覆
查看 sourcebot-dev/sourcebot 的全部 Issue
相似的 Issue
-
ui(ListToolbar): search takes the full row on a phone instead of sharing it with the result count未關閉
難度 2/5 1-3 小時 新手友好度 64/100
維護者通常 1 天內回覆
-
priority:high
難度 2/5 1-3 小時 新手友好度 72/100
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 78/100
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 65/100
immich-app/immich#32426 ·
維護者通常 1 天內回覆
-
documentation good first issue hacktoberfest help wanted
難度 2/5 1-3 小時 新手友好度 78/100
libredb/libredb-studio#1756 ·
維護者通常 1 天內回覆