Deployment
Diese Seite entspricht docker-compose.prod.yml und .env.example im Repository. Für lokale Entwicklung im Alltag: Installation.
Voraussetzungen
Abschnitt betitelt „Voraussetzungen“| Abhängigkeit | Minimum |
|---|---|
| Docker | 24+ |
| Docker Compose v2 | 2.20+ |
| RAM (App + Postgres + Redis) | 2 GB empfohlen (1 GB Minimum ist knapp) |
TLS-Terminierung erfolgt üblicherweise über einen Reverse Proxy (Nginx, Traefik, Caddy) oder deine Plattform (Coolify, Kubernetes Ingress).
Schnellstart
Abschnitt betitelt „Schnellstart“1. Klonen und konfigurieren
Abschnitt betitelt „1. Klonen und konfigurieren“git clone https://github.com/defcon1702/orimora.git orimoracd orimoracp .env.example .envSetze alle als erforderlich markierten Variablen in .env. Das Compose-File erwartet mindestens:
APP_URL— öffentliche HTTPS-URL, z. B.https://wiki.example.comPOSTGRES_PASSWORD— ein starker Zufallswert (wird inDATABASE_URLinterpoliert)SESSION_SECRET,MAGIC_LINK_SECRET,LLM_ENCRYPTION_KEY— 64-stellige Hex-Strings (je 32 Byte)
2. Secrets erzeugen
Abschnitt betitelt „2. Secrets erzeugen“Nutze dasselbe Muster wie im Root-DEPLOYMENT.md:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" # für jedes *64-Hex*-Secret wiederholenBewahre die erzeugten Werte in einem Passwortmanager auf; committe .env niemals.
3. Bauen und starten
Abschnitt betitelt „3. Bauen und starten“docker compose -f docker-compose.prod.yml up -d --build4. Datenbank-Migrationen ausführen
Abschnitt betitelt „4. Datenbank-Migrationen ausführen“Erforderlich beim ersten Deploy und nach Upgrades, die neue Migrationsdateien mitbringen:
docker compose -f docker-compose.prod.yml exec app yarn db:migrate5. Verifizieren
Abschnitt betitelt „5. Verifizieren“curl -s http://localhost:3000/api/readyÖffne dann APP_URL im Browser und schließe das Onboarding ab, falls dies eine frische Datenbank ist.
Umgebungsvariablen (Produktion)
Abschnitt betitelt „Umgebungsvariablen (Produktion)“Die folgende Tabelle deckt sich mit .env.example. Die Variablennamen unterscheiden sich von älteren Entwürfen, die SECRET_KEY oder PUBLIC_BASE_URL verwendeten.
Pflicht (typische Produktion)
Abschnitt betitelt „Pflicht (typische Produktion)“| Variable | Zweck |
|---|---|
APP_URL | Kanonische öffentliche URL — genutzt in Links, OAuth-Redirects, Magic-Link-URLs |
DATABASE_URL | In Compose automatisch aus POSTGRES_* gesetzt; eigene Installs müssen auf PostgreSQL 16+ zeigen |
REDIS_URL | Zeigt auf den mitgelieferten redis-Service in Compose (redis://redis:6379, kein Passwort) |
SESSION_SECRET | Signiert Session-Cookies |
MAGIC_LINK_SECRET | Signiert Magic-Link-Tokens |
LLM_ENCRYPTION_KEY | AES-256-GCM für gespeicherte LLM-API-Keys (erforderlich, auch wenn KI deaktiviert ist) |
POSTGRES_PASSWORD | Passwort des Datenbank-Nutzers (Compose) |
Optional, aber gebräuchlich
Abschnitt betitelt „Optional, aber gebräuchlich“| Variable | Zweck |
|---|---|
CRON_SECRET | Bearer-Token für POST /api/admin/cron.cleanup (geplanter Trash-Purge, Erinnerungen) |
COLLAB_SECRET | Shared Secret für Yjs-/Hocuspocus-Kollaboration |
COLLAB_MAX_CONNECTIONS | Begrenzt gleichzeitige Collab-Sockets (Default 50) |
SMTP_* | Ausgehende E-Mail für Magic Links (SMTP_PASSWORD in .env.example) |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | Google OAuth |
OIDC_* | Generischer OIDC-Provider |
STORAGE_DRIVER / S3_* | Upload-Speicher-Backend. Default local (Platte). STORAGE_DRIVER=s3 + S3_BUCKET/S3_ACCESS_KEY/S3_SECRET_KEY (+ optional S3_ENDPOINT/S3_FORCE_PATH_STYLE/S3_PRESIGN_TTL_SECONDS) speichert Anhänge/Avatare/Logos in einem S3-kompatiblen Bucket, ausgeliefert über presigned URLs — siehe Konfiguration. (Getrennt von Off-Site-Backups, die BACKUP_RCLONE_REMOTE nutzen; BACKUP_S3_BUCKET ist geparst, aber nicht verdrahtet.) |
Vollständige Spaltenreferenz: DEPLOYMENT.md im Repo.
Reverse Proxy
Abschnitt betitelt „Reverse Proxy“Terminiere TLS an Nginx, Caddy oder Traefik und leite zum App-Container weiter (Port 3000 innerhalb des Netzwerks). Du musst erhalten:
HostX-Forwarded-ForX-Forwarded-Proto(HTTPS-Erkennung)- WebSocket-Upgrade-Header für
/collab
Beispiel-Nginx-Location (HTTP → App):
location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;}Updates
Abschnitt betitelt „Updates“git pulldocker compose -f docker-compose.prod.yml build appdocker compose -f docker-compose.prod.yml up -ddocker compose -f docker-compose.prod.yml exec app yarn db:migrateBeobachte die Anwendungslogs während des ersten Requests nach einer Schema-Änderung.
Backups & Notfallwiederherstellung
Abschnitt betitelt „Backups & Notfallwiederherstellung“Betreibe Produktion nicht ohne Backups. BACKUP_ENABLED ist im Produktions-Compose-File standardmäßig true (tägliche verschlüsselte DB-Dumps + wöchentliche Markdown-Exporte), aber du musst trotzdem:
CRON_SECRETsetzen (treibt die geplanten Backup- + Cleanup-Jobs).- Ein Off-Site-Ziel (
BACKUP_RCLONE_REMOTE) konfigurieren, damit ein Host-Verlust nicht alles verliert. - Den Recovery-Code sichern (einmalig unter Einstellungen → Admin → Backups angezeigt) — Off-Site-Kopien sind verschlüsselt und ohne ihn nicht zu entschlüsseln.
Probe dann eine Wiederherstellung. Siehe Backups und das Notfallwiederherstellungs-Runbook.
Fehlerbehebung
Abschnitt betitelt „Fehlerbehebung“| Problem | Prüfungen |
|---|---|
| OAuth-Redirect-Mismatch | APP_URL muss exakt mit der URL in der Google-/OIDC-Konsole übereinstimmen |
| Redis-Verbindungsfehler | REDIS_URL erreichbar; redis-Container healthy |
| 502 vom Proxy | App lauscht nicht auf erwartetem Port; WebSocket-Pfad blockiert |
| Migration schlägt fehl | DB zuerst sichern; sicherstellen, dass nur ein Migration-Runner gleichzeitig läuft |
Weiterführend
Abschnitt betitelt „Weiterführend“- Konfiguration — SMTP, KI, S3, MCP OAuth
- Backups · Notfallwiederherstellung — verschlüsselte Off-Site-Backups + Restore
- REST-API Überblick — Rate-Limits und Auth
- Architektur — Stack-Überblick