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

63
docker-compose.yml Normal file
View File

@@ -0,0 +1,63 @@
# Onyscribe Admin – Admin-Oberfläche + Postgres. Für Coolify (Docker-Compose-Ressource) und lokal.
# Pflicht-Env: POSTGRES_PASSWORD, SECRET_KEY
# SECRET_KEY erzeugen: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
# Backups: Volume `pgdata` (Postgres) sichern – darin liegt ALLES (Tenants, Versionen, verschlüsselte Secrets).
# ACHTUNG: SECRET_KEY ebenfalls sichern – ohne ihn sind die Secrets in der DB nicht entschlüsselbar.
services:
admin:
build:
context: .
# Standard: vendored Core (lokal). Produktion: ADMIN_DOCKERFILE=Dockerfile.fromcore + CORE_IMAGE=<registry>/transkript-platform:<tag>
dockerfile: ${ADMIN_DOCKERFILE:-Dockerfile}
args:
CORE_IMAGE: ${CORE_IMAGE:-scratch}
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgresql+psycopg://onyscribe:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD setzen}@db:5432/onyscribe
SECRET_KEY: ${SECRET_KEY:?SECRET_KEY setzen}
PORT: "8300"
# Login der Admin-Plattform (login.onyva.dev). Mit AUTH_ENABLED=true sind Client + Zugriffsregel Pflicht.
AUTH_ENABLED: ${AUTH_ENABLED:-false}
OIDC_ISSUER: ${OIDC_ISSUER:-https://login.onyva.dev}
OIDC_CLIENT_ID: ${OIDC_CLIENT_ID:-}
OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET:-}
OIDC_REDIRECT_URI: ${OIDC_REDIRECT_URI:-}
OIDC_LOGOUT_REDIRECT_URI: ${OIDC_LOGOUT_REDIRECT_URI:-}
APP_COOKIE_SECURE: ${APP_COOKIE_SECURE:-true}
ADMIN_ALLOWED_EMAILS: ${ADMIN_ALLOWED_EMAILS:-}
ADMIN_REQUIRED_ROLE: ${ADMIN_REQUIRED_ROLE:-}
# Deploys: ohne DEPLOY_LIVE=true nur Dry-Run. Token nur setzen, wenn lesende Dry-Run-Aufrufe gewünscht sind.
DEPLOY_LIVE: ${DEPLOY_LIVE:-false}
# Welche Tenants dürfen LIVE angefasst werden (Mittwald + Login-API)? leer = keiner · demo-admin,x = diese · * = alle
DEPLOY_ALLOWED_TENANTS: ${DEPLOY_ALLOWED_TENANTS:-}
MITTWALD_API_TOKEN: ${MITTWALD_API_TOKEN:-}
# Core-CI meldet neue Images hierher (POST /api/core/releases, Bearer-Token)
CORE_RELEASE_TOKEN: ${CORE_RELEASE_TOKEN:-}
# OIDC-Clients automatisch verwalten (Developer-API von login.onyva.dev). Key = Admin-Passwort-Äquivalent!
ONYVA_LOGIN_API_KEY: ${ONYVA_LOGIN_API_KEY:-}
OIDC_SYNC_LIVE: ${OIDC_SYNC_LIVE:-false} # true erlaubt Schreiben im Login-System (auch ohne DEPLOY_LIVE)
# Optional statt Eintrag unter Einstellungen → Geteilte Secrets
CORTECS_API_KEY: ${CORTECS_API_KEY:-}
expose:
- "8300" # Coolify: Domain auf Service „admin“ legen, Port 8300 (https://<host>:8300). Lokal veröffentlicht docker-compose.override.yml den Port.
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: onyscribe
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD setzen}
POSTGRES_DB: onyscribe
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U onyscribe -d onyscribe"]
interval: 5s
timeout: 5s
retries: 10
volumes:
pgdata: