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>
64 lines
3.1 KiB
YAML
64 lines
3.1 KiB
YAML
# 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:
|