macroadster/starlight-helm

GitHub: macroadster/starlight-helm

一套用于在 Kubernetes 上快速部署 Starlight Bitcoin 智能合约平台的 Helm Chart,包含 API 服务、Stargate 后端和数据库。

Stars: 1 | Forks: 0

# Starlight Helm Stack 一个完整的 Bitcoin 原生智能合约系统,在保持区块链安全的同时实现有用的工作。该技术栈结合了由 AI 驱动的安全机制(可检测区块链图像中的隐藏数据)以及用于提案、资金和验证工作的完整工作流系统——所有这些都建立在 Bitcoin 之上,支持智能合约、escrow 和争议解决。 用于运行 Starlight API、Stargate 和 Postgres 的最小 chart。 ## 快速开始 ``` # 1. 创建 secrets(身份验证必需) kubectl create secret generic stargate-stack-secrets \ --from-literal=starlight-api-key="starlight-api-$(date +%s)-$(openssl rand -hex 8)" \ --from-literal=starlight-ingest-token="starlight-ingest-$(date +%s)-$(openssl rand -hex 8)" \ --from-literal=stargate-api-key="starlight-api-$(date +%s)-$(openssl rand -hex 8)" \ --from-literal=stargate-ingest-token="stargate-ingest-$(date +%s)-$(openssl rand -hex 8)" \ --from-literal=starlight-stego-callback-secret="stego-callback-$(date +%s)-$(openssl rand -hex 8)" # 2. 使用 secrets 部署 helm install starlight-stack . \ --set secrets.createDefault=false \ --set secrets.name=stargate-stack-secrets \ --set secrets.starlightApiKey=true \ --set secrets.starlightIngestToken=true \ --set secrets.stargateApiKey=true \ --set secrets.stargateIngestToken=true \ --set secrets.starlightStegoCallbackSecret=true # 3. 验证部署 kubectl get pods kubectl port-forward svc/starlight-api 8080:8080 & curl http://localhost:8080/health ``` **⚠️ 关键的 Token 匹配要求**: - `starlight-api-key` 和 `stargate-api-key` **必须匹配**,Stargate → Starlight API 调用才能正常工作 - `starlight-ingest-token` 和 `stargate-ingest-token` **必须匹配**,Starlight → Stargate 回调才能正常工作 - Token 不匹配会导致 403/401 错误并阻碍 inscription 工作流 ## 要求 - 具有 Docker/Helm/Kubectl 对集群的访问权限(支持 kind/minikube)。 - 镜像在本地或 registry 中可用: - `stargate:latest`(由 `stargate/Dockerfile` 构建) - `starlight-api:latest`(由 `starlight/Dockerfile` 构建) ## Values ## 构建镜像(本地) ``` # Stargate cd stargate docker build -t stargate:latest . # Starlight API(如果不可用) cd starlight docker build -t starlight-api:latest . ``` ## Secret 设置(生产环境必需) Starlight ↔ Stargate 集成需要身份验证 token 以进行安全通信。请在部署前创建 secret: ### 选项 1:自动创建 Secret(推荐) ``` cd starlight-helm # 使用安全的随机值创建 secrets # 注意:对于 Stargate → Starlight 调用,starlight-api-key 和 stargate-api-key 必须匹配 # 注意:对于 Starlight → Stargate 回调,starlight-ingest-token 和 stargate-ingest-token 必须匹配 TIMESTAMP=$(date +%s) RANDOM=$(openssl rand -hex 8) kubectl create secret generic stargate-stack-secrets \ --from-literal=starlight-api-key="starlight-api-$TIMESTAMP-$RANDOM" \ --from-literal=starlight-ingest-token="starlight-ingest-$TIMESTAMP-$RANDOM" \ --from-literal=stargate-api-key="starlight-api-$TIMESTAMP-$RANDOM" \ --from-literal=stargate-ingest-token="starlight-ingest-$TIMESTAMP-$RANDOM" \ --from-literal=starlight-stego-callback-secret="stego-callback-$TIMESTAMP-$(openssl rand -hex 8)" # 在 Helm 中启用 secret 使用 helm install starlight-stack . \ --set secrets.createDefault=false \ --set secrets.name=stargate-stack-secrets \ --set secrets.starlightApiKey=true \ --set secrets.starlightIngestToken=true \ --set secrets.stargateApiKey=true \ --set secrets.stargateIngestToken=true \ --set secrets.starlightStegoCallbackSecret=true ``` ### 选项 2:手动创建 Secret ``` # 使用您自己的值创建 secret # 重要提示:API keys 和 ingest tokens 请使用匹配的值 kubectl create secret generic stargate-stack-secrets \ --from-literal=starlight-api-key="your-shared-api-key" \ --from-literal=starlight-ingest-token="your-shared-ingest-token" \ --from-literal=stargate-api-key="your-shared-api-key" \ --from-literal=stargate-ingest-token="your-shared-ingest-token" \ --from-literal=starlight-stego-callback-secret="your-stego-callback-secret" # 启用 secret 使用进行部署 helm install starlight-stack . \ --set secrets.createDefault=false \ --set secrets.name=stargate-stack-secrets \ --set secrets.starlightApiKey=true \ --set secrets.starlightIngestToken=true \ --set secrets.stargateApiKey=true \ --set secrets.stargateIngestToken=true \ --set secrets.starlightStegoCallbackSecret=true ``` ### Secret 密钥说明 | Secret Key | 使用者 | 用途 | |------------|----------|---------| | `starlight-api-key` | Starlight API | 对 `/inscribe` 和受保护的 endpoint 进行身份验证 | | `starlight-ingest-token` | Starlight API | 用于 Stargate ingestion 回调的 token | | `stargate-api-key` | Stargate | 用于调用 Starlight 服务的 API key | | `stargate-ingest-token` | Stargate | 用于 Stargate ingestion endpoint 的 token | | `starlight-stego-callback-secret` | Starlight API | 用于隐写术检测回调的 HMAC secret | **重要**: - `starlight-api-key` 和 `stargate-api-key` **必须匹配**,Stargate → Starlight API 调用才能正常工作。 - `starlight-ingest-token` 和 `stargate-ingest-token` **必须匹配**,Starlight → Stargate 回调才能正常工作。 ### 选项 3:开发环境(无身份验证) ``` # 仅用于开发 - 禁用身份验证 helm install starlight-stack . \ --set starlight.allowAnonymousScan=true \ --set starlight.apiKey="demo-api-key" \ --set stargate.apiKey="demo-api-key" ``` ## 安装 ``` cd starlight-helm # 基本安装(不包含 secrets - 不推荐用于生产环境) helm install starlight-stack . \ --set image.stargate.repository=stargate \ --set image.stargate.tag=latest \ --set image.starlight.repository=starlight-api \ --set image.starlight.tag=latest # 带有 secrets 的生产环境安装(推荐) helm install starlight-stack . \ --set secrets.createDefault=false \ --set secrets.name=stargate-stack-secrets \ --set secrets.starlightApiKey=true \ --set secrets.starlightIngestToken=true \ --set secrets.stargateApiKey=true \ --set secrets.stargateIngestToken=true \ --set secrets.starlightStegoCallbackSecret=true # 用于 testnet 部署 helm install starlight-stack . \ --set stargate.bitcoinNetwork=testnet \ --set secrets.createDefault=false \ --set secrets.name=stargate-stack-secrets \ --set secrets.starlightApiKey=true \ --set secrets.starlightIngestToken=true \ --set secrets.stargateApiKey=true \ --set secrets.stargateIngestToken=true \ --set secrets.starlightStegoCallbackSecret=true # 默认值已指向上述标签;仅在使用不同名称时覆盖。 # 启用 ingress(示例;为您的集群更新 hosts/tls) helm upgrade --install starlight-stack . \ --set ingress.enabled=true \ --set ingress.className=nginx # 对于本地 ingress 测试(带有 ingress-nginx 的 docker-desktop/minikube),请添加到 /etc/hosts: # 127.0.0.1 starlight.local stargate.local # TLS:默认值期望一个带有 SANs starlight.local、stargate.local 的 secret `stargate-stack-tls`, # kubectl create secret tls stargate-stack-tls --cert=stargate-stack.crt --key=stargate-stack.key # 然后访问: # curl -kI https://starlight.local/ # curl -kI https://stargate.local/ # 可观测性 # - 后端 metrics:https://stargate.local/metrics(prometheus 格式) # - Starlight metrics:如果已代理则为 https://stargate.local/metrics,或在端口 8080 上进行 service scrape(/metrics) # - 包含用于 Prometheus 自动抓取的 service annotations(prometheus.io/scrape=true) ``` ## 验证 ``` # 检查 pod 状态 kubectl get pods # 检查 services kubectl get svc stargate starlight-api stargate-postgres # 用于测试的 port forward kubectl port-forward svc/stargate 3001:3001 & kubectl port-forward svc/starlight-api 8080:8080 & # 测试健康检查端点 curl http://localhost:3001/api/health curl http://localhost:8080/health # 测试 Starlight inscription(需要身份验证) # 从 secret 中获取 API key: STARLIGHT_API_KEY=$(kubectl get secret stargate-stack-secrets -o jsonpath='{.data.starlight-api-key}' | base64 -d) curl -X POST "http://localhost:8080/inscribe" \ -H "Authorization: Bearer $STARLIGHT_API_KEY" \ -F "image=@test-image.png" \ -F "message=test message" \ -F "method=lsb" ``` ## Mock 合约和 Ingestion 的 CI 自动化 对于需要模拟合约和提案 ingestion 的持续集成 (CI) 环境或本地开发,您可以使用以下设置: ### Mock 合约和任务 要在启动时自动将一组演示合约和任务加载到系统中,请在您的 `values.yaml` 中配置以下内容: - \`stargate.seedFixtures\`:将其设置为 \`true\`。启用后,Stargate 后端在初始化时将检查 \`mcp_contracts\` 和 \`mcp_tasks\` 数据库表是否为空。如果为空,它将使用预定义的演示数据填充它们。 \`\`\`yaml stargate: seedFixtures: true # 设置为 true 以加载演示合约和任务 \`\`\` 演示数据定义在 Stargate 源代码的 \`stargate/backend/mcp/fixtures.go\` 中。如果您的测试需要自定义 mock 数据,通常需要修改此源文件或实现一种覆盖它的机制。 ### 提案的 Mock Ingestion 系统通过轮询 \`starlight_ingestions\` 服务中的 "pending" 记录来 ingest 提案。虽然没有类似于 \`seedFixtures\` 的直接 ingestion "mocking" 标志,但您可以通过以下方式在 CI 环境中模拟提案 ingestion: 1. **创建 Pending Ingestion 记录**:在您的 CI 设置中,您将以编程方式将状态为 "pending" 的记录插入到 \`starlight_ingestions\` 服务/数据库中。这些记录代表您想要被 ingest 的提案。 2. **使用 Markdown 提案**:ingestion 同步服务可以从 Markdown 字符串中解析提案。您可以制作特定的 Markdown 内容(可能嵌入在 ingestion 记录元数据中)来定义您的 mock 提案。 3. **控制默认值**:您可以使用环境变量来影响已 ingest 提案的默认预算和资金地址: - \`STARGATE_DEFAULT_BUDGET_SATS\`:设置此环境变量可为未指定预算的提案定义一个默认预算(以 satoshis 为单位)。 - \`STARGATE_DEFAULT_FUNDING_ADDRESS\`:设置此环境变量可为提案定义一个默认资金地址。 这些环境变量可以直接在您的部署配置中(例如在 \`Deployment\` manifest 中,或通过 Helm 的 \`--set\` 标志)为 Stargate 后端进行设置。 这些设置提供了一种可靠的方法,使您能够以自动化方式使用预定义的合约和提案来测试 Starlight 集群的行为。 ## 故障排除 ### 403/401 身份验证错误 #### Starlight API 返回 403 Forbidden **原因**:Stargate 和 Starlight 之间的 API key 不匹配 ``` # 检查 API key 不匹配 echo "Starlight expects:" kubectl exec deployment/starlight-api -- env | grep STARGATE_API_KEY echo "Stargate sends:" kubectl exec deployment/stargate -- env | grep STARGATE_API_KEY # 通过更新 Stargate API key 使其与 Starlight 匹配来修复 kubectl patch secret stargate-stack-secrets --patch='{"data":{"stargate-api-key":"'$(kubectl get secret stargate-stack-secrets -o jsonpath='{.data.starlight-api-key}')'"}}' kubectl rollout restart deployment/stargate ``` #### Stargate 回调返回 401 Unauthorized **原因**:Starlight 和 Stargate 之间的 Ingest token 不匹配 ``` # 检查 ingest token 不匹配 echo "Starlight sends:" kubectl exec deployment/starlight-api -- env | grep STARGATE_INGEST_TOKEN echo "Stargate expects:" kubectl exec deployment/stargate -- env | grep STARGATE_INGEST_TOKEN # 通过更新 Stargate ingest token 使其与 Starlight 匹配来修复 STARLIGHT_INGEST_TOKEN=$(kubectl get secret stargate-stack-secrets -o jsonpath='{.data.starlight-ingest-token}' | base64 -d) kubectl patch secret stargate-stack-secrets --patch='{"data":{"stargate-ingest-token":"'$(echo -n "$STARLIGHT_INGEST_TOKEN" | base64)'"}}' kubectl rollout restart deployment/stargate ``` ### 403 Forbidden 错误 如果您从 Starlight 的 `/inscribe` endpoint 收到 `403 Forbidden`: ``` # 检查 API key 不匹配 echo "Starlight expects:" kubectl exec deployment/starlight-api -- env | grep STARGATE_API_KEY echo "Stargate sends:" kubectl exec deployment/stargate -- env | grep STARGATE_API_KEY # 通过更新 Stargate API key 使其与 Starlight 匹配来修复 kubectl patch secret stargate-stack-secrets --patch='{"data":{"stargate-api-key":"'$(kubectl get secret stargate-stack-secrets -o jsonpath='{.data.starlight-api-key}')'"}}' kubectl rollout restart deployment/stargate ``` ### 回调问题 如果 Starlight → Stargate 回调失败: ``` # 检查 callback URLs 和 tokens echo "Starlight sends:" kubectl exec deployment/starlight-api -- env | grep STARGATE_INGEST_TOKEN echo "Stargate expects:" kubectl exec deployment/stargate -- env | grep STARGATE_INGEST_TOKEN # 通过更新 Stargate 使其与 Starlight 匹配来修复 token 不匹配 STARLIGHT_INGEST_TOKEN=$(kubectl get secret stargate-stack-secrets -o jsonpath='{.data.starlight-ingest-token}' | base64 -d) kubectl patch secret stargate-stack-secrets --patch='{"data":{"stargate-ingest-token":"'$(echo -n "$STARLIGHT_INGEST_TOKEN" | base64)'"}}' kubectl rollout restart deployment/stargate # 手动测试 callback 端点 STARGATE_INGEST_TOKEN=$(kubectl get secret stargate-stack-secrets -o jsonpath='{.data.stargate-ingest-token}' | base64 -d) curl -X POST "http://localhost:3001/api/ingest-inscription" \ -H "X-Ingest-Token: $STARGATE_INGEST_TOKEN" \ -H "Content-Type: application/json" \ -d '{"id":"test","filename":"test.png","method":"lsb","message_length":10,"image_base64":"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/Ptq4YQAAAABJRU5ErkJggg==","metadata":{}}' ``` ## Secret 管理 ### 查看当前 Secret ``` # 列出所有 secret 值(已解码) kubectl get secret stargate-stack-secrets -o yaml | awk ' /^\s*[a-zA-Z-]+:/ { key = $1 gsub(/:/, "", key) getline if (/data:/) { getline value = $2 cmd = "echo " value " | base64 -d" cmd | getline decoded close(cmd) print key ": " decoded } }' # 或查看特定 secret kubectl get secret stargate-stack-secrets -o jsonpath='{.data.starlight-api-key}' | base64 -d ``` ### 更新 Secret ``` # 更新单个 secret 值 kubectl patch secret stargate-stack-secrets --patch='{"data":{"starlight-api-key":"'$(echo -n 'new-api-key' | base64)'"}}' # 重要提示:更新匹配对以维持通信 kubectl patch secret stargate-stack-secrets --patch='{"data":{"stargate-api-key":"'$(echo -n 'new-api-key' | base64)'"}}' # 重启 deployments 以加载新 secrets kubectl rollout restart deployment/starlight-api kubectl rollout restart deployment/stargate ``` ### 轮换 Secret ``` # 生成新 secrets 并更新(带有匹配对) TIMESTAMP=$(date +%s) RANDOM=$(openssl rand -hex 8) kubectl create secret generic stargate-stack-secrets-new \ --from-literal=starlight-api-key="starlight-api-$TIMESTAMP-$RANDOM" \ --from-literal=starlight-ingest-token="starlight-ingest-$TIMESTAMP-$RANDOM" \ --from-literal=stargate-api-key="starlight-api-$TIMESTAMP-$RANDOM" \ --from-literal=stargate-ingest-token="starlight-ingest-$TIMESTAMP-$RANDOM" \ --from-literal=starlight-stego-callback-secret="stego-callback-$TIMESTAMP-$(openssl rand -hex 8)" # 替换旧 secret kubectl delete secret stargate-stack-secrets kubectl get secret stargate-stack-secrets-new -o yaml | sed 's/name: stargate-stack-secrets-new/name: stargate-stack-secrets/' | kubectl apply -f - kubectl delete secret stargate-stack-secrets-new # 重启 deployments kubectl rollout restart deployment/starlight-api kubectl rollout restart deployment/stargate ``` ## 卸载 ``` helm uninstall starlight-stack kubectl delete secret stargate-stack-secrets # Optional: remove secrets ```
标签:子域名突变, 测试用例, 请求拦截