LibreChat für deine eigene ChatGPT-artige App selbst hosten
Folge dem auf deinem eigenen Server. Kostenlos starten, keine Karte nötig
LibreChat ist eine Open-Source-Web-Oberfläche im ChatGPT-Stil, die mit OpenAI, Anthropic, Google und Dutzenden anderer Modellanbieter (oder einem lokalen) über deine eigenen API-Keys spricht, statt deine Konversationen durch das eigene Chat-Produkt eines Drittanbieters zu schicken. Das eine, was es braucht und nicht zu Railyards üblichen Postgres- oder Redis-Addons passt, ist MongoDB, und genau da gehen die meisten Self-Hosting-Versuche schief. Am Ende dieser Anleitung laufen LibreChat und MongoDB zusammen hinter HTTPS, mit echten generierten Secrets statt der Defaults, und einem Backup, aus dem du wiederherstellen kannst.
Was du brauchst
- Einen Server mit Docker und dem Compose-Plugin. Ein Hetzner CX23 (2 vCPU, 4 GB RAM, 40 GB NVMe, 5,99 €/Monat exkl. MwSt.) betreibt LibreChat und MongoDB komfortabel, da die eigentliche Modell-Inferenz auf den Servern des Anbieters passiert, nicht auf deinen.
- Eine Domain oder Subdomain, die auf die IP-Adresse des Servers zeigt.
- Mindestens einen API-Key eines Modellanbieters (OpenAI, Anthropic oder jeder andere, den LibreChat unterstützt), hinzugefügt, nachdem die App läuft.
- SSH-Zugang zum Server.
Schritt 1: Die echten Secrets generieren
LibreChat wird mit Platzhalterwerten für seine JWT- und Credential-Verschlüsselungs-Secrets ausgeliefert, die für einen lokalen Test funktionieren, aber nicht sicher in Produktion sind. Vier Werte brauchen echte, eindeutige Daten: ein JWT-Secret, ein JWT-Refresh-Secret, ein Credential-Verschlüsselungs-Key und seinen Initialisierungsvektor. Die letzten beiden haben exakte Längenanforderungen, die die anderen nicht haben, CREDS_KEY muss ein 32-Byte-Key sein (64 Hex-Zeichen), und CREDS_IV exakt ein 16-Byte-IV (32 Hex-Zeichen), sonst wirft LibreChats eigene AES-CBC-Verschlüsselung beim Start algorithm.iv must contain exactly 16 bytes:
openssl rand -hex 32 # JWT_SECRET
openssl rand -hex 32 # JWT_REFRESH_SECRET
openssl rand -hex 32 # CREDS_KEY (32 bytes)
openssl rand -hex 16 # CREDS_IV (16 bytes)
openssl rand -hex 24 # MONGO_PASSWORD
mkdir -p /opt/librechat
cat > /opt/librechat/.env <<'EOF'
JWT_SECRET=paste-the-first-value-here
JWT_REFRESH_SECRET=paste-the-second-value-here
CREDS_KEY=paste-the-third-value-here
CREDS_IV=paste-the-fourth-value-here
MONGO_PASSWORD=paste-the-fifth-value-here
EOF
chmod 600 /opt/librechat/.env
Schritt 2: Die Compose-Datei schreiben
services:
librechat:
image: ghcr.io/danny-avila/librechat:v0.8.7
restart: unless-stopped
env_file: .env
depends_on:
- mongo
environment:
MONGO_URI: mongodb://librechat:${MONGO_PASSWORD}@mongo:27017/LibreChat?authSource=admin
DOMAIN_CLIENT: https://chat.yourdomain.com
DOMAIN_SERVER: https://chat.yourdomain.com
ALLOW_REGISTRATION: "true"
volumes:
- librechat_uploads:/app/uploads
expose:
- "3080"
mongo:
image: mongo:7
restart: unless-stopped
environment:
MONGO_INITDB_ROOT_USERNAME: librechat
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
volumes:
- librechat_mongo_data:/data/db
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
depends_on:
- librechat
volumes:
librechat_uploads:
librechat_mongo_data:
caddy_data:
caddy_config:
Diese Anleitung pinnt v0.8.7, das zum Zeitpunkt der Erstellung aktuelle stabile Release. MONGO_URI trägt den Nutzernamen und das Passwort, mit dem MongoDB in Schritt 1 initialisiert wurde, zusammen mit authSource=admin, da der Root-Nutzer in der admin-Datenbank angelegt wird, nicht in LibreChat. DOMAIN_CLIENT und DOMAIN_SERVER brauchen beide die exakte HTTPS-URL, unter der Nutzer die App erreichen; LibreChat nutzt sie, um Cookies und CORS-Regeln zu bauen, eine Abweichung zeigt sich hier also als verwirrender Login-Fehler statt eines offensichtlichen Konfigurationsfehlers. ALLOW_REGISTRATION steht im Upstream-Image standardmäßig auf true, und ist hier wichtig, weil LibreChat keinen anderen eingebauten Weg hat, den ersten Account anzulegen, Social Login ist auch standardmäßig aus, das ist also bis Schritt 4 nicht optional.
Prüfe, ob die Datei parst:
docker compose config
Schritt 3: DNS setzen, Caddy hinzufügen, den Stack starten
chat.yourdomain.com {
reverse_proxy librechat:3080
}
docker compose up -d
docker compose ps
curl -I https://chat.yourdomain.com
Du solltest beide Dienste als Up sehen und curl sollte HTTP/2 200 mit gültigem Zertifikat zurückgeben.
Schritt 4: Deinen Account anlegen, dann die Tür schließen
Öffne https://chat.yourdomain.com, registriere dich über das normale Anmeldeformular, und bestätige, dass du dich einloggen kannst. Sobald jeder benötigte Account existiert, schalte die Registrierung ab:
environment:
ALLOW_REGISTRATION: "false"
docker compose up -d librechat
Schritt 5: Einen Modellanbieter hinzufügen
LibreChat selbst wird nie mit einem Modell-API-Key ausgeliefert; es ist ein Client für Anbieter, die du selbst mitbringst. Füge deinen Key als Umgebungsvariable hinzu, OpenAI als Beispiel:
environment:
OPENAI_API_KEY: ${OPENAI_API_KEY}
Füge OPENAI_API_KEY=your-real-key zu .env hinzu, dann wieder docker compose up -d librechat. Öffne die App, wähle den Anbieter aus dem Modell-Dropdown, und sende eine Nachricht. Du solltest eine echte Antwort bekommen, keinen Fehler über einen fehlenden oder ungültigen Key.
Schritt 6: MongoDB und Uploads sichern
Konversationen, Accounts und verschlüsselte Credentials leben alle in MongoDB; hochgeladene Dateien liegen auf dem librechat_uploads-Volume.
cat > /opt/librechat/backup.sh <<'EOF'
#!/bin/sh
cd /opt/librechat
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
docker compose exec -T mongo mongodump --authenticationDatabase admin \
-u librechat -p "${MONGO_PASSWORD}" --db LibreChat --archive --gzip > backups/mongo-$TIMESTAMP.archive.gz
find backups -mtime +14 -delete
EOF
mkdir -p /opt/librechat/backups
chmod +x /opt/librechat/backup.sh
(crontab -l 2>/dev/null; echo "0 3 * * * /opt/librechat/backup.sh") | crontab -
Führe es einmal manuell aus und prüfe, ob es funktioniert hat: ./backup.sh && ls -lh backups. Du solltest eine datierte .archive.gz-Datei sehen. Wiederherstellen geht mit mongorestore --authenticationDatabase admin -u librechat -p "$MONGO_PASSWORD" --archive=path/to/file --gzip, genauso über docker compose exec ausgeführt. Kopiere Backups vom Server weg; sowohl das laufende MongoDB-Volume als auch sein einziges Backup zu verlieren, bedeutet, dass jede Konversation und jedes gespeicherte Credential weg ist.
Schritt 7: Upgrade
docker compose pull librechat
docker compose up -d librechat
LibreChat führt seine eigenen Datenmigrationen gegen MongoDB bei Bedarf automatisch beim Start aus. Prüfe die Release-Notes der Zielversion vor einem Sprung über mehrere Versionen, denn eine Breaking Change am Credential-Verschlüsselungsschema wäre die eine Kategorie, über die man vorher lesen sollte.
Die Abkürzung: mit Railyard
Alles oben, MongoDB als der eine Datenspeicher, den LibreChat sich wirklich nicht mit Railyards Postgres- oder Redis-Addons teilen kann, die JWT- und Credential-Secrets generiert statt bei den Defaults gelassen, das Uploads-Volume, ist auch das, was Railyards LibreChat-Stack-Vorlage für dich einrichtet. Verbinde einen Server, wähle dann LibreChat im Vorlagenkatalog: app.railyard.run/deploy?stack=librechat. Railyard generiert JWT_SECRET, JWT_REFRESH_SECRET, CREDS_KEY und das 16-Byte-CREDS_IV für dich in der korrekten Länge, verdrahtet MongoDBs Connection-String automatisch, und stellt HTTPS für deine Domain aus; deinen eigenen Modellanbieter-Key fügst du weiterhin selbst hinzu, genauso wie in Schritt 5 oben.
Siehe Deploy per Knopfdruck und Datenbanken und Backups für mehr darüber, wie Vorlagen und persistente Daten auf der Plattform generell funktionieren.
Troubleshooting
Login funktioniert, aber nichts scheint zwischen Neustarts erhalten zu bleiben. Bestätige, dass librechat_mongo_data in der docker compose ps -a-Ausgabe ein echtes benanntes Volume ist, kein anonymes, das weggeräumt wurde; das führt meist auf einen früheren versehentlichen Lauf von docker compose down -v zurück, der Volumes zusammen mit Containern entfernt.
algorithm.iv must contain exactly 16 bytes beim Start. CREDS_IV wurde nicht mit exakt 16 Bytes (32 Hex-Zeichen) generiert. Führe openssl rand -hex 16 aus Schritt 1 erneut aus und prüfe, dass der Wert in .env exakt 32 Zeichen lang ist, nicht abgeschnitten oder aufgefüllt.
Das Anmeldeformular gibt einen 403 zurück. ALLOW_REGISTRATION ist false und es existieren noch keine Accounts, ein Henne-Ei-Problem, falls du es zu früh abgeschaltet hast. Setze es zurück auf true, lege die Accounts an, die du brauchst, und schalte es dann wieder aus wie in Schritt 4.
Das Modell-Dropdown zeigt einen Anbieter, aber jede Nachricht scheitert. Der API-Key für diesen Anbieter ist entweder nicht gesetzt, ungültig, oder hat auf Anbieterseite kein Guthaben mehr; prüfe docker compose logs librechat auf den spezifischen Upstream-Fehler, LibreChat gibt meist die eigene Meldung des Anbieters durch.
HTTPS wird nicht ausgestellt. docker compose logs caddy mit wiederholten ACME-Fehlern bedeutet fast immer, dass das DNS aus Schritt 3 noch nicht propagiert ist oder auf die falsche IP zeigt.
FAQ
Kann ich mehr als einen Modellanbieter gleichzeitig nutzen? Ja, füge so viele Anbieter-API-Keys als Umgebungsvariablen hinzu, wie du willst; Nutzer wählen das Modell pro Konversation aus demselben Dropdown.
Speichert LibreChat meine Konversationen beim Modellanbieter? Nein, der Anbieter sieht nur die Anfrage, die du ihm sendest; LibreChat speichert die Konversationshistorie selbst in deinem eigenen MongoDB, der Anbieter ist keine zweite Kopie deiner Daten.
Kann ich ein lokales Modell statt einer gehosteten API nutzen? Ja, LibreChat unterstützt jeden OpenAI-kompatiblen Endpunkt, einschließlich lokaler Inferenz-Server, über eine benutzerdefinierte Endpunkt-Konfiguration statt eines Anbieter-API-Keys.
Warum speziell MongoDB, wenn alles andere auf Railyard Postgres oder Redis ist? LibreChats eigenes Schema und Query-Muster sind von Anfang an um MongoDBs Dokumentmodell gebaut; das ist keine Wahl, die diese Anleitung oder Railyard trifft, das ist, was das Upstream-Projekt verlangt.
Was passiert, wenn ich den Server ohne Backup verliere? Jede Konversation, jeder Account und jedes gespeicherte Credential ist weg; es gibt keinen Wiederherstellungsweg für MongoDB-Daten, die nirgendwo anders gesichert wurden, deshalb ist Schritt 6 in der Praxis nicht optional.
Sobald die echten Secrets eingerichtet sind und die Registrierung geschlossen ist, verschwindet ein selbst gehostetes LibreChat weitgehend im Hintergrund. Die laufende Arbeit ist die Backup-Routine aus Schritt 6 und das Hinzufügen des Modellanbieters, den du tatsächlich nutzen willst.
Warum Leute sich dafür Railyard entscheiden
- Dein eigenes Cloud-Konto. Deploye auf DigitalOcean, Hetzner, Vultr, AWS, OVHcloud oder jedem Linux-Server per SSH, direkt von deinem Anbieter abgerechnet, ohne Aufschlag.
- Ein fester Preis pro Team. Free ist für immer kostenlos: ein Server plus ein Datenbankserver, drei Apps, keine Karte. Pro kostet 19 $ im Monat für bis zu fünf Server und unbegrenzte Apps. Team kostet 49 $ im Monat mit unbegrenzten Servern. Keine Kosten pro App, pro Deployment, pro Sitz oder pro Gigabyte.
- Templates mit einem Klick. Deploye Open-Source-Apps, wie Datenbanken, Analytics und Dev-Tools, mit einem Klick auf deinem eigenen Server.
- Verwaltete Datenbanken. Postgres, MySQL und Redis mit geplanten, wiederherstellungsgeprüften Backups und Point-in-Time-Recovery.
- Push-to-Deploy. Deploye von GitHub, GitLab oder der CLI, mit automatischem HTTPS und Releases ohne Ausfallzeit.