Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
263 lines
9.2 KiB
Plaintext
263 lines
9.2 KiB
Plaintext
---
|
||
title: Docker Compose
|
||
icon: docker
|
||
---
|
||
|
||
<Warning>
|
||
Docker-Container sind für produktives Hosting oder Selbsthosting vorgesehen. Zum Mitwirken siehe [Lokale Einrichtung](/l/de/developers/contribute/capabilities/local-setup).
|
||
</Warning>
|
||
|
||
## Überblick
|
||
|
||
Diese Anleitung enthält Schritt-für-Schritt-Anweisungen, um die Twenty-Anwendung mit Docker Compose zu installieren und zu konfigurieren. Das Ziel ist, den Prozess übersichtlich zu gestalten und häufige Fallstricke zu vermeiden, die Ihre Einrichtung unterbrechen könnten.
|
||
|
||
**Wichtig:** Ändern Sie nur die in dieser Anleitung explizit erwähnten Einstellungen. Andere Konfigurationen zu ändern, kann zu Problemen führen.
|
||
|
||
Siehe die Dokumentation [Umgebungsvariablen einrichten](/l/de/developers/self-host/capabilities/setup) zur erweiterten Konfiguration. Alle Umgebungsvariablen müssen in der Datei `docker-compose.yml` auf Server- und/oder Worker-Ebene deklariert werden, je nach Variable.
|
||
|
||
## Systemanforderungen
|
||
|
||
* RAM: Stellen Sie sicher, dass Ihre Umgebung mindestens 2 GB RAM hat. Unzureichender Speicher kann dazu führen, dass Prozesse abstürzen.
|
||
* Docker & Docker Compose: Stellen Sie sicher, dass beide installiert und aktuell sind.
|
||
|
||
## Option 1: Einzeiliges Skript
|
||
|
||
Installieren Sie die neueste stabile Version von Twenty mit einem einzigen Befehl:
|
||
|
||
```bash
|
||
bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
|
||
```
|
||
|
||
Um eine spezifische Version oder Zweig zu installieren:
|
||
|
||
```bash
|
||
VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
|
||
```
|
||
|
||
* Ersetzen Sie x.y.z mit der gewünschten Versionsnummer.
|
||
* Ersetzen Sie branch-name durch den Namen des Zweigs, den Sie installieren möchten.
|
||
|
||
## Option 2: Manuelle Schritte
|
||
|
||
Befolgen Sie diese Schritte für eine manuelle Einrichtung.
|
||
|
||
### Schritt 1: Einrichten der Umgebungsdatei
|
||
|
||
1. **Erstellen Sie die .env Datei**
|
||
|
||
Kopieren Sie die Beispielumgebungsdatei in eine neue .env-Datei in Ihrem Arbeitsverzeichnis:
|
||
|
||
```bash
|
||
curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
|
||
```
|
||
|
||
2. **Einen Verschlüsselungsschlüssel generieren**
|
||
|
||
Führen Sie den folgenden Befehl aus, um eine eindeutige Zufallszeichenfolge zu generieren:
|
||
|
||
```bash
|
||
openssl rand -base64 32
|
||
```
|
||
|
||
**Wichtig:** Bewahren Sie diesen Wert geheim auf / teilen Sie ihn nicht. Der Verlust von `ENCRYPTION_KEY` bedeutet den Verlust des Zugriffs auf alle in der Datenbank gespeicherten Secrets (OAuth-Tokens, Anwendungsvariablen, TOTP-Secrets usw.).
|
||
|
||
3. **Aktualisieren Sie die `.env`**
|
||
|
||
Ersetzen Sie den Platzhalterwert in Ihrer .env-Datei durch das generierte Token:
|
||
|
||
```ini
|
||
ENCRYPTION_KEY=random_string
|
||
```
|
||
|
||
Weitere Informationen findest du im [Leitfaden zur Schlüsselrotation](/l/de/developers/self-host/capabilities/key-rotation) mit Anweisungen zur Rotation ohne Ausfallzeit.
|
||
|
||
4. **Setzen Sie das Postgres-Passwort**
|
||
|
||
Aktualisieren Sie den Wert `PG_DATABASE_PASSWORD` in der .env-Datei mit einem starken Passwort ohne Sonderzeichen.
|
||
|
||
```ini
|
||
PG_DATABASE_PASSWORD=my_strong_password
|
||
```
|
||
|
||
### Schritt 2: Beschaffen Sie die Docker Compose-Datei
|
||
|
||
Laden Sie die `docker-compose.yml`-Datei in Ihr Arbeitsverzeichnis herunter:
|
||
|
||
```bash
|
||
curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
|
||
```
|
||
|
||
### Schritt 3: Anwendung starten
|
||
|
||
Starten Sie die Docker-Container:
|
||
|
||
```bash
|
||
docker compose up -d
|
||
```
|
||
|
||
### Schritt 4: Auf die Anwendung zugreifen
|
||
|
||
Wenn Sie twentyCRM auf Ihrem eigenen Computer hosten, öffnen Sie Ihren Browser und navigieren Sie zu [http://localhost:3000](http://localhost:3000).
|
||
|
||
Wenn Sie es auf einem Server hosten, prüfen Sie, ob der Server läuft und ob alles in Ordnung ist mit
|
||
|
||
```bash
|
||
curl http://localhost:3000
|
||
```
|
||
|
||
## Konfiguration
|
||
|
||
### Twenty für externen Zugriff freigeben
|
||
|
||
Standardmäßig läuft Twenty auf `localhost` an Port `3000`. Die UI bestimmt den API-Endpunkt aus dem eigenen Origin des Browsers, sodass sie von jedem Hostnamen geladen wird, der den Container erreicht – setze dennoch `SERVER_URL` auf deine öffentliche URL: Der Server verwendet sie für generierte Links (E-Mails, OAuth-Callbacks) und um HTTPS für sichere Cookies zu erkennen.
|
||
|
||
#### Erläuterung von `SERVER_URL`
|
||
|
||
* **Protokoll:** Verwenden Sie `http` oder `https` je nach Konfiguration.
|
||
* Verwenden Sie `http`, wenn Sie kein SSL eingerichtet haben.
|
||
* Verwenden Sie `https`, wenn Sie SSL konfiguriert haben.
|
||
* **Domain/IP:** Dies ist der Domainname oder die IP-Adresse, unter der Ihre Anwendung zugänglich ist.
|
||
* **Port:** Geben Sie die Portnummer an, wenn Sie nicht die Standardports verwenden (`80` für `http`, `443` für `https`).
|
||
|
||
### SSL-Anforderungen
|
||
|
||
SSL (HTTPS) ist erforderlich, damit bestimmte Browserfunktionen ordnungsgemäß funktionieren. Obwohl diese Funktionen möglicherweise während der lokalen Entwicklung funktionieren (da Browser localhost anders behandeln), ist eine ordnungsgemäße SSL-Einrichtung erforderlich, wenn Twenty auf einer regulären Domain gehostet wird.
|
||
|
||
Zum Beispiel erfordert die Clipboard-API möglicherweise einen sicheren Kontext - einige Funktionen wie Kopierknöpfe in der gesamten Anwendung funktionieren möglicherweise nicht ohne aktiviertes HTTPS.
|
||
|
||
Wir empfehlen dringend, Twenty hinter einem Reverse-Proxy mit SSL-Beendigung für optimale Sicherheit und Funktionalität zu konfigurieren.
|
||
|
||
#### Konfiguration der `SERVER_URL`
|
||
|
||
1. **Bestimmen Sie Ihre Zugriffs-URL**
|
||
* **Ohne Reverse-Proxy (Direkter Zugriff):**
|
||
|
||
Wenn Sie direkt ohne Reverse-Proxy auf die Anwendung zugreifen:
|
||
|
||
```ini
|
||
SERVER_URL=http://your-domain-or-ip:3000
|
||
```
|
||
|
||
* **Mit Reverse-Proxy (Standard-Ports):**
|
||
|
||
Wenn Sie einen Reverse-Proxy wie Nginx oder Traefik verwenden und SSL konfiguriert haben:
|
||
|
||
```ini
|
||
SERVER_URL=https://your-domain-or-ip
|
||
```
|
||
|
||
* **Mit Reverse-Proxy (Benutzerdefinierte Ports):**
|
||
|
||
Wenn Sie nicht standardisierte Ports verwenden:
|
||
|
||
```ini
|
||
SERVER_URL=https://your-domain-or-ip:custom-port
|
||
```
|
||
|
||
2. **Aktualisieren Sie die `.env` Datei**
|
||
|
||
Öffnen Sie Ihre `.env`-Datei und aktualisieren Sie die `SERVER_URL`:
|
||
|
||
```ini
|
||
SERVER_URL=http(s)://your-domain-or-ip:your-port
|
||
```
|
||
|
||
**Beispiele:**
|
||
|
||
* Direkter Zugriff ohne SSL:
|
||
```ini
|
||
SERVER_URL=http://123.45.67.89:3000
|
||
```
|
||
* Zugriff über Domain mit SSL:
|
||
```ini
|
||
SERVER_URL=https://mytwentyapp.com
|
||
```
|
||
|
||
3. **Starten Sie die Anwendung neu**
|
||
|
||
Damit die Änderungen wirksam werden, starten Sie die Docker-Container neu:
|
||
|
||
```bash
|
||
docker compose down
|
||
docker compose up -d
|
||
```
|
||
|
||
#### Überlegungen
|
||
|
||
* **Reverse Proxy-Konfiguration:**
|
||
|
||
Stellen Sie sicher, dass Ihr Reverse-Proxy Anfragen an den richtigen internen Port weiterleitet (`3000` standardmäßig). Konfigurieren Sie die SSL-Terminierung und alle erforderlichen Header.
|
||
|
||
* **Firewall-Einstellungen:**
|
||
|
||
Öffnen Sie die notwendigen Ports in Ihrer Firewall, um externen Zugriff zu ermöglichen.
|
||
|
||
* **Konsistenz:**
|
||
|
||
Die `SERVER_URL` muss mit der Art und Weise übereinstimmen, wie Nutzer in ihren Browsern auf Ihre Anwendung zugreifen.
|
||
|
||
#### Persistenz
|
||
|
||
* **Daten-Volumes:**
|
||
|
||
Die Docker-Compose-Konfiguration verwendet Volumes, um Daten für die Datenbank und den Serverspeicher persistent zu speichern.
|
||
|
||
* **Zustandslose Umgebungen:**
|
||
|
||
Wenn Sie in einer zustandslosen Umgebung bereitstellen (z. B. bei bestimmten Cloud-Diensten), konfigurieren Sie externen Speicher, um Daten persistent zu speichern.
|
||
|
||
## Sicherung und Wiederherstellung
|
||
|
||
Regelmäßige Sicherungen schützen Ihre CRM-Daten vor Verlust.
|
||
|
||
### Datenbanksicherung erstellen
|
||
|
||
```bash
|
||
docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
|
||
```
|
||
|
||
### Tägliche Sicherungen automatisieren
|
||
|
||
Zu Ihrer Crontab hinzufügen (`crontab -e`):
|
||
|
||
```bash
|
||
0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
|
||
```
|
||
|
||
### Aus Sicherung wiederherstellen
|
||
|
||
1. Anwendung stoppen:
|
||
|
||
```bash
|
||
docker compose stop server worker
|
||
```
|
||
|
||
2. Datenbank wiederherstellen:
|
||
|
||
```bash
|
||
docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
|
||
```
|
||
|
||
3. Dienste neu starten:
|
||
|
||
```bash
|
||
docker compose up -d
|
||
```
|
||
|
||
### Best Practices für Sicherungen
|
||
|
||
* **Wiederherstellungen regelmäßig testen** — überprüfen Sie, dass die Sicherungen tatsächlich funktionieren
|
||
* **Sicherungen extern aufbewahren** — Cloud-Speicher verwenden (S3, GCS usw.)
|
||
* **Sensible Daten verschlüsseln** — Sicherungen mit Verschlüsselung schützen
|
||
* **Mehrere Kopien aufbewahren** — tägliche, wöchentliche und monatliche Sicherungen vorhalten
|
||
|
||
## Fehlerbehebung
|
||
|
||
Sollten Sie auf ein Problem stoßen, schauen Sie sich die [Fehlerbehebung](/l/de/developers/self-host/capabilities/troubleshooting) für Lösungen an.
|
||
|
||
## Managed Hosting
|
||
|
||
<Tip>
|
||
Möchten Sie Twenty lieber nicht selbst betreiben und warten? [Finden Sie einen zertifizierten Twenty-Hosting-Partner](https://twenty.com/partners/list?categories=HOSTING\&ref=docs-docker-compose), der Ihre Instanz Ende-zu-Ende bereitstellt, hostet und verwaltet. *(Oder wenden Sie sich an unser Team: [contact@twenty.com](mailto:contact@twenty.com).)*
|
||
</Tip>
|