Zum Inhalt springen

Deployment

Diese Seite entspricht docker-compose.prod.yml und .env.example im Repository. Für lokale Entwicklung im Alltag: Installation.

AbhängigkeitMinimum
Docker24+
Docker Compose v22.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).

Terminal-Fenster
git clone https://github.com/defcon1702/orimora.git orimora
cd orimora
cp .env.example .env

Setze alle als erforderlich markierten Variablen in .env. Das Compose-File erwartet mindestens:

  • APP_URL — öffentliche HTTPS-URL, z. B. https://wiki.example.com
  • POSTGRES_PASSWORD — ein starker Zufallswert (wird in DATABASE_URL interpoliert)
  • SESSION_SECRET, MAGIC_LINK_SECRET, LLM_ENCRYPTION_KEY — 64-stellige Hex-Strings (je 32 Byte)

Nutze dasselbe Muster wie im Root-DEPLOYMENT.md:

Terminal-Fenster
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" # für jedes *64-Hex*-Secret wiederholen

Bewahre die erzeugten Werte in einem Passwortmanager auf; committe .env niemals.

Terminal-Fenster
docker compose -f docker-compose.prod.yml up -d --build

Erforderlich beim ersten Deploy und nach Upgrades, die neue Migrationsdateien mitbringen:

Terminal-Fenster
docker compose -f docker-compose.prod.yml exec app yarn db:migrate
Terminal-Fenster
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.

Die folgende Tabelle deckt sich mit .env.example. Die Variablennamen unterscheiden sich von älteren Entwürfen, die SECRET_KEY oder PUBLIC_BASE_URL verwendeten.

VariableZweck
APP_URLKanonische öffentliche URL — genutzt in Links, OAuth-Redirects, Magic-Link-URLs
DATABASE_URLIn Compose automatisch aus POSTGRES_* gesetzt; eigene Installs müssen auf PostgreSQL 16+ zeigen
REDIS_URLZeigt auf den mitgelieferten redis-Service in Compose (redis://redis:6379, kein Passwort)
SESSION_SECRETSigniert Session-Cookies
MAGIC_LINK_SECRETSigniert Magic-Link-Tokens
LLM_ENCRYPTION_KEYAES-256-GCM für gespeicherte LLM-API-Keys (erforderlich, auch wenn KI deaktiviert ist)
POSTGRES_PASSWORDPasswort des Datenbank-Nutzers (Compose)
VariableZweck
CRON_SECRETBearer-Token für POST /api/admin/cron.cleanup (geplanter Trash-Purge, Erinnerungen)
COLLAB_SECRETShared Secret für Yjs-/Hocuspocus-Kollaboration
COLLAB_MAX_CONNECTIONSBegrenzt gleichzeitige Collab-Sockets (Default 50)
SMTP_*Ausgehende E-Mail für Magic Links (SMTP_PASSWORD in .env.example)
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETGoogle 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.

Terminiere TLS an Nginx, Caddy oder Traefik und leite zum App-Container weiter (Port 3000 innerhalb des Netzwerks). Du musst erhalten:

  • Host
  • X-Forwarded-For
  • X-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;
}
Terminal-Fenster
git pull
docker compose -f docker-compose.prod.yml build app
docker compose -f docker-compose.prod.yml up -d
docker compose -f docker-compose.prod.yml exec app yarn db:migrate

Beobachte die Anwendungslogs während des ersten Requests nach einer Schema-Änderung.

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:

  1. CRON_SECRET setzen (treibt die geplanten Backup- + Cleanup-Jobs).
  2. Ein Off-Site-Ziel (BACKUP_RCLONE_REMOTE) konfigurieren, damit ein Host-Verlust nicht alles verliert.
  3. 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.

ProblemPrüfungen
OAuth-Redirect-MismatchAPP_URL muss exakt mit der URL in der Google-/OIDC-Konsole übereinstimmen
Redis-VerbindungsfehlerREDIS_URL erreichbar; redis-Container healthy
502 vom ProxyApp lauscht nicht auf erwartetem Port; WebSocket-Pfad blockiert
Migration schlägt fehlDB zuerst sichern; sicherstellen, dass nur ein Migration-Runner gleichzeitig läuft