Onyscribe Admin: Initialer Stand

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>
This commit is contained in:
RubenRWU
2026-10-15 15:30:26 +02:00
commit 7d8c226da2
89 changed files with 13975 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
#!/usr/bin/env python3
"""Lokaler Fake von login.onyva.dev /api/v1 – zum Ausprobieren des OIDC-Abgleichs ohne echtes Login-System.
python scripts/fake_login_server.py # http://127.0.0.1:8399/api/v1, Key: onyva_testkey, Nutzer: anna@x.de, bob@x.de
ONYVA_LOGIN_API_KEY=onyva_testkey OIDC_SYNC_LIVE=true uvicorn app.main:app --port 8300
→ Einstellungen → „API-Basis“ = http://127.0.0.1:8399/api/v1
"""
import json
import sys
from http.server import BaseHTTPRequestHandler, HTTPServer
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from tests.fakelogin import FakeLogin # noqa: E402
fake = FakeLogin()
class H(BaseHTTPRequestHandler):
def _do(self):
n = int(self.headers.get("Content-Length") or 0)
body = json.loads(self.rfile.read(n)) if n else None
status, data, hdrs = fake(self.command, f"http://x{self.path}", {"Authorization": self.headers.get("Authorization", "")}, body)
self.send_response(status)
for k, v in hdrs.items():
self.send_header(k, v)
self.send_header("Content-Type", "application/json")
out = json.dumps(data).encode() if data is not None else b""
self.send_header("Content-Length", str(len(out)))
self.end_headers()
self.wfile.write(out)
print(f"{self.command} {self.path} → {status}", flush=True)
do_GET = do_POST = do_PUT = do_PATCH = do_DELETE = _do
def log_message(self, *a):
pass
if __name__ == "__main__":
print("Fake-Login auf http://127.0.0.1:8399/api/v1 (Key onyva_testkey)", flush=True)
HTTPServer(("127.0.0.1", 8399), H).serve_forever()