Admin-Plattform für die Tenants von Onyscribe: Editor mit Live-Vorschau (echter Core in Sandbox), Versionen, KI-Agent (Cortecs), OIDC-Abgleich über die Login-Developer-API, Deploy-Engine (Mittwald, gesperrt ohne DEPLOY_LIVE, Freigabe pro Tenant), Core-Vertrag (Schema/Manifest), Core-Releases mit Kompatibilitätsprüfung, Canary-Rollout und Rollback, Zustandsabgleich. Runbook: docs/RUNBOOK_PARALLELTEST.md Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
34 lines
1.3 KiB
Python
34 lines
1.3 KiB
Python
"""Zentrale Konfiguration (Env-getrieben)."""
|
|
from __future__ import annotations
|
|
|
|
import base64
|
|
import hashlib
|
|
import os
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
if not os.getenv("ONYSCRIBE_SKIP_DOTENV"): # lokale Entwicklung: .env im Projektordner einlesen (Docker/Coolify setzen die Env direkt)
|
|
try:
|
|
from dotenv import load_dotenv
|
|
load_dotenv(ROOT / ".env", override=False) # echte Umgebungsvariablen haben Vorrang
|
|
except ImportError:
|
|
pass
|
|
DATA = ROOT / ".data"
|
|
DATA.mkdir(exist_ok=True)
|
|
|
|
DATABASE_URL = os.getenv("DATABASE_URL", f"sqlite:///{DATA / 'onyscribe-admin.db'}")
|
|
# Entwicklungs-Fallback: abgeleiteter Key. In Produktion SECRET_KEY setzen!
|
|
_raw = os.getenv("SECRET_KEY", "").strip()
|
|
SECRET_KEY = _raw or base64.urlsafe_b64encode(hashlib.sha256(b"onyscribe-admin-dev").digest()).decode()
|
|
AUTH_ENABLED = os.getenv("AUTH_ENABLED", "false").lower() == "true"
|
|
|
|
# Vendored Snapshot des Plattform-Cores (Preview führt den echten Core aus)
|
|
PLATFORM_DIR = Path(os.getenv("PLATFORM_DIR", ROOT / "vendor" / "platform"))
|
|
PREVIEW_CACHE = ROOT / ".preview-cache"
|
|
PREVIEW_CACHE.mkdir(exist_ok=True)
|
|
|
|
# Pfad zur bestehenden transkript-platform (nur für den Importer)
|
|
LEGACY_PLATFORM = Path(os.getenv("LEGACY_PLATFORM", ROOT.parent / "transkript-platform"))
|
|
|
|
APP_NAME = "Onyscribe Admin"
|