For the complete documentation index, see /developers/llms.txt Markdown versions: append .md to any /developers/{slug} URL. Browse structure: /developers/sitemap.md This page: /developers/self-hosted-setup.md

Self-Hosted-Setup

Kurz gesagt: Diese Seite richtet sich an Betreiber:innen, die Eigen Mesh auf ihrer eigenen Infrastruktur mit Docker deployen und betreiben. Endnutzer:innen auf deiner Instanz registrieren sich weiterhin über die normale App — deine Aufgabe ist es, zuerst den Stack zu provisionieren.

Nutze diesen Weg, wenn du Eigen auf deinem eigenen Stack deployst und betreibst (Docker Compose). Endnutzer:innen durchlaufen nach der Anmeldung weiterhin die Managed-Onboarding-Tour; deine Aufgabe ist es, zuerst den Stack, die Secrets und optionale Zahlungs-/Social-Integrationen zu provisionieren.

Siehe auch Überblick & Schnellstart für Docker-Compose-Befehle und Coolify-Hinweise.

Anzulegende Konten (Betreiber:in)

Lege nur die Konten an, die zu deiner geplanten Abrechnungs- und Auth-Konfiguration passen.

Konto Wann du es brauchst Wofür es genutzt wird
EUrouter Plattform-Guthaben und/oder EUrouter-BYOK Gateway für Chat + Embeddings über Routing-Regeln (LLM_BASE_URL, SERVICE_API_KEY_EUROUTER, LLM_RULE_CHAT, LLM_RULE_EMBEDDING).
OpenRouter Plattform-Guthaben, OpenRouter-BYOK und/oder Sprache-zu-Text Gateway für Chat, Embeddings und Diktat-STT (OPENROUTER_BASE_URL, SERVICE_API_KEY_OPENROUTER oder OPENROUTER_API_KEY, optional LLM_MODEL_*).
PayPal Developer Wallet-Aufladungen (Plattform-Guthaben) In-App-Guthabenkäufe (PAYPAL_API_BASE, PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET). Weglassen, wenn alle Nutzer:innen ausschließlich BYOK verwenden.
Google Cloud OAuth-Client Optionale Social-Anmeldung GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET — Callback {ORIGIN}/api/auth/callback/google.
GitHub OAuth-App Optionale Social-Anmeldung GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET — Callback {ORIGIN}/api/auth/callback/github.

Für Postgres, pgvector oder Apache AGE brauchst du keine separaten Konten — die laufen innerhalb des Compose-Stacks.

Umgebungsvariablen (Betreiber:in)

Kopiere .env.example nach .env im eigen-Repository und setze die Werte vor docker compose up. Die vollständige Referenz findest du unter Umgebungsvariablen. Gruppiert nach Zweck:

Erforderlich — ohne diese läuft die App nicht sicher

Variable Zweck Wie setzen
BETTER_AUTH_SECRET Session-Verschlüsselung openssl rand -base64 32
AGE_GRAPH_NAME Name des Apache-AGE-Graphen (muss zur Postgres-Initialisierung passen) eigen_graph (Standard)
ORIGIN Öffentliche URL, die Nutzer:innen und OAuth-Callbacks verwenden z. B. https://eigen.example.com
TENANT_MASTER_KEY Master-Key für Envelope-Verschlüsselung pro Tenant Starkes Zufalls-Secret (siehe Tenant-Encryption-Runbook)
DATABASE_URL Connection-String der App Compose-Standard: postgres://eigen:eigen@db:5432/eigen
DATABASE_ADMIN_URL Migrationen, RLS, pg_cron Für Self-Hosting dieselbe Superuser-URL wie oben

Committe .env niemals und teile TENANT_MASTER_KEY und BETTER_AUTH_SECRET mit niemandem. Ein Rotieren von TENANT_MASTER_KEY ohne Neu-Verschlüsselung zerstört bestehende Tenant-Daten.

Erforderlich für LLM — mindestens ein Abrechnungsweg muss funktionieren

Option A — Plattform-Guthaben (Eigen-Wallet, Standard-Abrechnungsmodus für Nutzer:innen)

Nutzer:innen laden über PayPal auf; die App nutzt dabei deine Service-Account-Gateway-Keys.

Variable Zweck
SERVICE_API_KEY_EUROUTER EUrouter-Service-Key (Plattform-Abrechnung)
LLM_BASE_URL EUrouter-API-Origin (ohne abschließenden Slash), z. B. https://api.eurouter.ai/v1
LLM_RULE_CHAT EUrouter-Routing-Regel-UUID für Chat
LLM_RULE_EMBEDDING EUrouter-Routing-Regel-UUID für Embeddings
SERVICE_API_KEY_OPENROUTER OpenRouter-Service-Key (falls OpenRouter als Plattform-Provider genutzt wird)
OPENROUTER_BASE_URL OpenRouter-API-Origin, z. B. https://openrouter.ai/api/v1
PAYPAL_API_BASE https://api-m.sandbox.paypal.com (Sandbox) oder https://api-m.paypal.com (Live)
PAYPAL_CLIENT_ID Client-ID der PayPal-REST-App
PAYPAL_CLIENT_SECRET Secret der PayPal-REST-App

Option B — Nur BYOK (Nutzer:innen hinterlegen Keys unter Einstellungen → LLM → BYOK)

Du kannst trotzdem Env-Fallbacks setzen, die genutzt werden, wenn eine Nutzerin oder ein Nutzer keine Keys in der Datenbank gespeichert hat:

Variable Zweck
LLM_BASE_URL EUrouter-Base-URL
LLM_API_KEY EUrouter-API-Key als Fallback
LLM_RULE_CHAT / LLM_RULE_EMBEDDING EUrouter-Regel-UUIDs
OPENROUTER_BASE_URL OpenRouter-Base-URL
OPENROUTER_API_KEY OpenRouter-API-Key als Fallback

Nutzer:innen mit BYOK müssen ihre Zugangsdaten in der UI konfigurieren (oder sich auf diese Env-Fallbacks verlassen) und den Abrechnungsmodus in den Einstellungen auf Eigenen Key nutzen setzen.

Empfohlen für den Produktionsbetrieb

Variable Zweck
POSTGRES_PASSWORD Starkes DB-Passwort (vom Standard eigen ändern)
EIGEN_APP_DB_PASSWORD Passwort für die RLS-App-Rolle eigen_app
ADMIN_CONSOLIDATION_KEY Sichert den nächtlichen Consolidation-Webhook (openssl rand -hex 32)
CONSOLIDATION_INTERNAL_URL URL, über die Postgres/pg_cron die App erreicht (Compose: http://app:3000)

Optional

Variable Zweck
VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_SUBJECT Web-Push-Benachrichtigungen (npx web-push generate-vapid-keys)
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET Google-Anmeldung
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET GitHub-Anmeldung
ADMIN_NAME, ADMIN_EMAIL, ADMIN_PASSWORD Bootstrap des ersten Admin-Kontos beim Containerstart (siehe unten)
LLM_MIN_REQUEST_INTERVAL_MS Globales LLM-Throttling (Standard 1000 ms)
EMBEDDING_COMPRESS_INTENSITY Kompression der Embedding-Payload (lite | full | ultra)

Schritte für die Erstbereitstellung

  1. Klonen und konfigurieren

    git clone https://github.com/your-org/eigen.git && cd eigen
    cp .env.example .env
    # .env bearbeiten — die oben genannten Pflichtvariablen setzen
    
  2. Stack starten

    docker compose up -d --build
    
  3. Schema und RLS anwenden (nur beim ersten Deploy; der Produktions-Entrypoint führt Migrationen bei späteren Starts automatisch aus)

    npm install
    npm run db:push:force
    npm run db:rls
    
  4. Optional: Admin-Konto bootstrappen — setze ADMIN_NAME, ADMIN_EMAIL und ADMIN_PASSWORD in .env, bevor du den App-Container startest, oder führe aus:

    docker compose exec app node scripts/create-admin.mjs
    

    Das Skript ist idempotent (überspringt, falls die E-Mail bereits existiert). Admin-Nutzer:innen sehen weiterhin die Einführungstour, bis sie das Onboarding abschließen oder überspringen.

  5. Verifizieren — öffne ORIGIN im Browser, registriere dich oder melde dich als Admin an, absolviere die Einführungstour und prüfe die LLM-Abrechnung (Credits oder BYOK), bevor du testweise erfasst.

Self-Hosted-Registrierung für Endnutzer:innen

Nutzer:innen können Get early access — self-hosted öffnen (/signup?plan=self-hosted). Wie bei der Managed-Registrierung ist die Plan-Kennzeichnung rein informativ; das Verhalten hängt davon ab, wie du die Umgebungsvariablen und PayPal/BYOK konfiguriert hast, nicht vom Query-Parameter.

Verweise sie auf:

  • Einstellungen → LLM → Credits, wenn du Plattform-Guthaben und PayPal aktiviert hast.
  • Einstellungen → LLM → BYOK, wenn sie ihre eigenen EUrouter- oder OpenRouter-Keys nutzen sollen.

Kurzreferenz: wer konfiguriert was

Aspekt Managed (Endnutzer:in) Self-Hosted (Betreiber:in) Self-Hosted (Endnutzer:in)
Docker / Postgres / AGE Eigen Du
BETTER_AUTH_SECRET, TENANT_MASTER_KEY, ORIGIN Eigen Du
Service-Gateway-Keys (SERVICE_API_KEY_*) Eigen Du
PayPal (Wallet-Aufladungen) Eigen (falls angeboten) Du (optional) Zahlt über PayPal-UI
Persönliche LLM-Keys Nur bei Wechsel zu BYOK BYOK-Tab in den Einstellungen
Einführungstour Ja Ja
Capture / Activity / Chat Ja Ja

Problembehandlung

Siehe Problembehandlung für Deployment-, LLM-, MCP- und Verschlüsselungsprobleme.

Nächste Schritte

Agenten-Hinweise

This documentation is published for humans and AI agents. Bevorzuge .md URLs für strukturierte Inhalte.

  • Index: /developers/llms.txt
  • Full export: /developers/llms-full.txt
  • Sitemap: /developers/sitemap.md
  • Raw page: append `.md` to any /developers/{slug} URL
  • Example: GET /developers/mcp-overview.md

Dynamic `?ask=` and `?goal=` query on markdown URLs is planned — see docs/planning/10-docs-query-api-design.md.