Deploy: Stack-Auflösung mit Rückfall über die Projekt-UUID und aussagekräftiger Fehlermeldung; CORTECS_API_KEY aus der Admin-Env zählt als gesetzt

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
RubenRWU
2026-10-15 16:08:56 +02:00
parent 8c3795ec8c
commit fd5f12a8ca
3 changed files with 58 additions and 2 deletions

View File

@@ -20,6 +20,12 @@ from app.services import contract, crypto, guard, onyva_login, store
from app.services.mittwald import DeployError, Mittwald, mask_env
PORT = "8276"
# Geteilte Secrets, die – falls nicht in der DB gesetzt – aus der Env der Admin-Plattform kommen (gleicher Key wie für Agent/Prompt-Test)
ENV_FALLBACK_SECRETS = ("CORTECS_API_KEY",)
def _env_secret(key: str) -> str:
return os.getenv(key, "").strip() if key in ENV_FALLBACK_SECRETS else ""
def live_enabled() -> bool:
@@ -75,6 +81,10 @@ def build_env(db, t: Tenant, reveal: bool) -> dict[str, str]:
env[s_.key] = crypto.decrypt(s_.value_enc) if reveal else "•••• gesetzt"
elif not reveal:
env[s_.key] = "⚠ fehlt (Wert noch nicht in der Admin-DB)"
for k in ENV_FALLBACK_SECRETS: # Admin-Env als Rückfall für geteilte Secrets ohne DB-Wert
v = _env_secret(k)
if v and (k not in env or not env[k] or env[k].startswith("⚠")):
env[k] = v if reveal else "•••• gesetzt (aus Admin-Env)"
if t.source == "admin":
env["TENANT_SOURCE"] = "admin"
env["ADMIN_URL"] = setting(db, "admin_public_url", "https://<admin-host>")
@@ -85,6 +95,7 @@ def missing_secrets(db, t: Tenant) -> list[str]:
"""Pflicht-Secrets laut Schema, die weder beim Tenant noch geteilt einen Wert haben."""
cfg, _ = store.content(db, t, "current")
have = {s.key for s in db.scalars(select(Secret).where((Secret.tenant_id == t.id) | Secret.tenant_id.is_(None))) if s.value_enc}
have |= {k for k in ENV_FALLBACK_SECRETS if _env_secret(k)}
need = set(contract.required_secrets(cfg))
if t.source == "admin":
need.add("ADMIN_BUNDLE_TOKEN")