[email protected]

Twenty CRM Installation auf Ubuntu 24.04 mit Caddy und automatischen SSL-Zertifikaten

Twenty CRM Installation auf Ubuntu 24.04 mit Caddy und automatischen SSL-Zertifikaten

Hinweis zum Inhalt: Die Informationen in diesem Artikel wurden nach bestem Wissen zum Zeitpunkt der Veröffentlichung zusammengestellt. Technische Details, Preise, Versionen, Lizenzmodelle und externe Inhalte können sich ändern. Bitte prüfen Sie die genannten Angaben eigenständig, insbesondere vor geschäftskritischen oder sicherheitsrelevanten Entscheidungen. Dieser Artikel ersetzt keine individuelle Fach-, Rechts- oder Steuerberatung.

Sie interessieren sich für das vorgestellte Produkt?
Sprechen Sie uns an! Bei WZ-IT übernehmen wir Beratung, Installation, Support, Betrieb, Wartung und Monitoring Ihrer Lösung.
Vereinbaren Sie hier Ihr kostenloses und unverbindliches Gespräch:
Termin vereinbaren.

Twenty CRM ist eine moderne, schlanke Alternative zu umfangreichen CRM-Systemen wie Odoo. Als Open-Source-Lösung ermöglicht es Ihnen, die volle Kontrolle über Ihre Kundendaten zu behalten und gleichzeitig von einer benutzerfreundlichen, modernen Oberfläche zu profitieren. In dieser Anleitung zeigen wir Ihnen, wie Sie Twenty CRM auf einem Ubuntu 24.04 Server installieren und automatisch SSL-Zertifikate von Let's Encrypt mit Caddy einrichten.

Inhaltsverzeichnis

Voraussetzungen

  • Ein Ubuntu 24.04 Server (z.B. ein VPS von Hetzner oder einem anderen Anbieter)
  • Zugriff auf den Server via SSH
  • Domain, die auf den Server zeigt (mind. A Eintrag) (z.B. crm.example.com)

In unserem Beispiel verwenden wir die Domain crm-demo.wz-it.com. Sie können diese Domain in der Anleitung durch Ihre eigene Domain ersetzen. Wir haben die Domain mit einem A Eintrag auf die IP-Adresse des Servers gesetzt, auf dem wir Twenty CRM installieren möchten. Hier ein Auszug aus der DNS-Konfiguration:

DNS Eintrag für Twenty CRM

Schritt 1: Server vorbereiten

Wir melden uns per SSH als root oder einem Benutzer mit sudo-Rechten auf dem Server an und aktualisieren die Paketliste:

apt update && apt upgrade -y

Schritt 2: Docker und Docker Compose installieren

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
rm get-docker.sh

Dieses Skript installiert die neuste Version von Docker und Docker Compose. Schauen Sie sich auch gerne den Inhalt des Skripts an, um zu verstehen, was genau passiert. Generell ist es keine gute Idee, Skripte aus dem Internet blind auszuführen, aber in diesem Fall ist es eine gängige Methode, um Docker zu installieren.

Schritt 3: Benutzer für Twenty CRM erstellen

Wir erstellen einen neuen Benutzer, der später für die Twenty CRM Installation verwendet wird. Außerdem fügen wir den Benutzer zur Docker-Gruppe hinzu, damit er Docker-Befehle ohne sudo ausführen kann. Dies ist wichtig, da Twenty CRM in Docker-Containern läuft und der Benutzer Zugriff auf die Docker-Ressourcen benötigt.

adduser --system --group --home /opt/twenty twenty
sudo usermod -aG docker twenty

Schritt 4: Twenty CRM Installation vorbereiten

Wir wechseln in das Benutzerverzeichnis und erstellen die notwendigen Dateien für Twenty CRM:

cd /opt/twenty

Zuerst erstellen wir die Docker Compose Konfiguration. Sie basiert auf der offiziellen docker-compose.yml (Stand Oktober 2026) und ergänzt Caddy als Reverse Proxy:

sudo -u twenty nano docker-compose.yml

Fügen Sie folgenden Inhalt ein:

name: twenty
services:
  server:
    image: 'twentycrm/twenty:${TAG:-latest}'
    volumes:
      - server-local-data:/app/packages/twenty-server/.local-storage
    environment:
      NODE_PORT: 3000
      PG_DATABASE_URL: 'postgres://${PG_DATABASE_USER:-postgres}:${PG_DATABASE_PASSWORD:-postgres}@${PG_DATABASE_HOST:-db}:${PG_DATABASE_PORT:-5432}/${PG_DATABASE_NAME:-default}'
      SERVER_URL: '${SERVER_URL}'
      REDIS_URL: '${REDIS_URL:-redis://redis:6379}'
      DISABLE_DB_MIGRATIONS: '${DISABLE_DB_MIGRATIONS}'
      DISABLE_CRON_JOBS_REGISTRATION: '${DISABLE_CRON_JOBS_REGISTRATION}'
      STORAGE_TYPE: '${STORAGE_TYPE}'
      ENCRYPTION_KEY: '${ENCRYPTION_KEY}'
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: 'curl --fail http://localhost:3000/healthz'
      interval: 5s
      timeout: 5s
      retries: 20
    restart: always
    networks:
      - twenty-network
  worker:
    image: 'twentycrm/twenty:${TAG:-latest}'
    volumes:
      - server-local-data:/app/packages/twenty-server/.local-storage
    command:
      - yarn
      - 'worker:prod'
    environment:
      PG_DATABASE_URL: 'postgres://${PG_DATABASE_USER:-postgres}:${PG_DATABASE_PASSWORD:-postgres}@${PG_DATABASE_HOST:-db}:${PG_DATABASE_PORT:-5432}/${PG_DATABASE_NAME:-default}'
      SERVER_URL: '${SERVER_URL}'
      REDIS_URL: '${REDIS_URL:-redis://redis:6379}'
      DISABLE_DB_MIGRATIONS: 'true'
      DISABLE_CRON_JOBS_REGISTRATION: 'true'
      STORAGE_TYPE: '${STORAGE_TYPE}'
      ENCRYPTION_KEY: '${ENCRYPTION_KEY}'
    depends_on:
      db:
        condition: service_healthy
      server:
        condition: service_healthy
    restart: always
    networks:
      - twenty-network
  db:
    image: 'postgres:16'
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      POSTGRES_DB: '${PG_DATABASE_NAME:-default}'
      POSTGRES_USER: '${PG_DATABASE_USER:-postgres}'
      POSTGRES_PASSWORD: '${PG_DATABASE_PASSWORD:-postgres}'
    healthcheck:
      test: 'pg_isready -U ${PG_DATABASE_USER:-postgres} -h localhost -d postgres'
      interval: 5s
      timeout: 5s
      retries: 10
    restart: always
    networks:
      - twenty-network
  redis:
    image: redis
    restart: always
    command:
      - '--maxmemory-policy'
      - noeviction
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - twenty-network
  caddy:
    image: caddy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./caddy/data/:/data/
      - ./caddy/config/:/config/
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
    restart: always
    networks:
      - twenty-network
volumes:
  db-data: null
  server-local-data: null
networks:
  twenty-network:
    driver: bridge

Schritt 5: Umgebungsvariablen konfigurieren

Erstellen Sie die .env Datei mit den notwendigen Konfigurationen:

sudo -u twenty nano .env

Fügen Sie folgenden Inhalt ein:

TAG=v2.46 # Ersetzen Sie dies durch die gewünschte Version von Twenty CRM, z.B. v2.46
ENCRYPTION_KEY=HIER_GENERIERTES_SECRET_EINFÜGEN
PG_DATABASE_USER=postgres
PG_DATABASE_PASSWORD=HIER_SICHERES_PASSWORT_EINFÜGEN
PG_DATABASE_NAME=default
PG_DATABASE_HOST=db
PG_DATABASE_PORT=5432
DISABLE_DB_MIGRATIONS=false
DISABLE_CRON_JOBS_REGISTRATION=false
REDIS_URL=redis://redis:6379
SERVER_URL=https://crm-demo.wz-it.com
STORAGE_TYPE=local

Generieren Sie einen sicheren ENCRYPTION_KEY und ein Datenbankpasswort mit folgenden Befehlen. Das Passwort landet unverändert in der Datenbank-URL und sollte daher keine Sonderzeichen enthalten:

# ENCRYPTION_KEY generieren
openssl rand -base64 32

# Sicheres Datenbankpasswort ohne Sonderzeichen generieren
openssl rand -hex 32

Seit Version 2.5 verschlüsselt Twenty gespeicherte Geheimnisse mit ENCRYPTION_KEY; die frühere Variable APP_SECRET wird nur noch für ältere Instanzen benötigt, die vor ENCRYPTION_KEY eingerichtet wurden (Upgrade Guide, .env.example). Stand Oktober 2026 ist v2.46.0 vom 12. Oktober 2026 die aktuelle Version.

Ersetzen Sie:

  • HIER_GENERIERTES_SECRET_EINFÜGEN mit dem generierten ENCRYPTION_KEY
  • HIER_SICHERES_PASSWORT_EINFÜGEN mit dem generierten Datenbankpasswort
  • https://crm-demo.wz-it.com bei SERVER_URL mit Ihrer eigenen Domain (z.B. https://crm.ihre-domain.de)

Schritt 6: Caddy als Reverse Proxy einrichten

Erstellen Sie die Verzeichnisse für Caddy und die Konfigurationsdatei:

sudo -u twenty mkdir -p /opt/twenty/caddy

Erstellen Sie die Datei Caddyfile im Caddy-Verzeichnis:

sudo -u twenty nano /opt/twenty/caddy/Caddyfile

Fügen Sie folgenden Inhalt ein:

{
    email [email protected] # Ihre E-Mail-Adresse für Let's Encrypt Benachrichtigungen
}

crm-demo.wz-it.com { # Ersetzen Sie dies durch Ihre Domain
    reverse_proxy http://server:3000
}

Ersetzen Sie crm-demo.wz-it.com durch Ihre eigene Domain und [email protected] durch Ihre E-Mail-Adresse. Die E-Mail-Adresse wird für die Let's Encrypt Zertifikatsregistrierung verwendet.

Schritt 7: Twenty CRM starten

Wir starten nun Twenty CRM mit Docker Compose:

sudo -u twenty docker compose up -d

Twenty CRM wird nun gestartet und sollte nach wenigen Minuten über HTTPS erreichbar sein. Sie können dies überprüfen, indem Sie Ihre Domain in Ihrem Browser aufrufen (in unserem Beispiel wäre das https://crm-demo.wz-it.com, bei Ihnen entsprechend die Domain, die Sie in der Caddyfile konfiguriert haben).

Troubleshooting: Manuelle Datenbank-Initialisierung

Beim Start prüft der Server-Container, ob das Schema core existiert, und initialisiert eine leere Datenbank automatisch (Entrypoint-Skript). Falls Sie sich trotzdem nicht einloggen können oder Datenbankfehler auftreten, können Sie die Initialisierung manuell anstoßen:

# In den Server-Container wechseln
sudo -u twenty docker compose exec server bash

# In das richtige Verzeichnis wechseln
cd /app/packages/twenty-server

# Datenbank initialisieren
yarn database:init:prod

Nach erfolgreicher Initialisierung verlassen Sie den Container mit exit und starten Sie den Server neu:

sudo -u twenty docker compose restart server

Schritt 8: Initial Setup

Nach erfolgreichem Start können Sie Twenty CRM über Ihre Domain aufrufen. Sie werden zur Login-Seite weitergeleitet:

Twenty CRM Login

Beim ersten Aufruf werden Sie durch das Initial Setup geführt, wo Sie Ihren Admin-Account erstellen können:

Twenty CRM Initial Setup

Nach der Einrichtung haben Sie Zugriff auf das moderne Twenty CRM Dashboard.

Twenty CRM Dashboard

Updates

Seit Version 1.23 unterstützt Twenty versionsübergreifende Upgrades: Sie können direkt auf die neueste Version wechseln, indem Sie TAG in der .env anpassen und docker compose pull sowie docker compose up -d ausführen. Instanzen älter als 1.23 müssen schrittweise über jede getaggte Hauptversion aktualisiert werden, und ab Version 2.34 ist PostgreSQL 15 oder neuer erforderlich (Upgrade Guide). Legen Sie vor jedem Update ein Datenbank-Backup an.

Firewall-Konfiguration

Wenn Sie eine Firewall auf Ihrem Server eingerichtet haben, stellen Sie sicher, dass die Ports 80 (HTTP) und 443 (HTTPS) geöffnet sind. Dies ist notwendig, damit Caddy die Anfragen über HTTP und HTTPS entgegennehmen kann.

Fazit

Mit dieser Anleitung haben Sie Twenty CRM erfolgreich auf einem Ubuntu 24.04 Server installiert und mit Caddy ein SSL-Zertifikat von Let's Encrypt eingerichtet. Twenty CRM bietet eine moderne, benutzerfreundliche Alternative zu komplexeren CRM-Systemen wie Odoo und ist besonders für kleinere bis mittelgroße Unternehmen geeignet, die eine schlanke CRM-Lösung suchen.

Weitere Informationen und Dokumentation finden Sie auf der offiziellen Twenty CRM Website: https://twenty.com/ und im GitHub Repository: https://github.com/twentyhq/twenty.

Quellen

Timo Wevelsiep

Geschrieben von

Timo Wevelsiep

Co-Founder & CEO

Co-Founder von WZ-IT. Spezialisiert auf Cloud-Infrastruktur, Open-Source-Plattformen und Managed Services für KMUs und Enterprise-Kunden weltweit.

Häufig gestellte Fragen

Antworten auf wichtige Fragen zu diesem Thema

Unternehmen weltweit vertrauen WZ-IT

  • Stadtwerke Brühl
  • DGHO e.V.
  • solarwerkstatt berlin
  • Krüger Dirndl
  • ABCO Water Systems
  • Golem.de
  • EVADXB
  • nextGYM
  • AInergy
  • ml&s
  • Odiseo Solutions
  • Annota
  • ARGE
  • SweetConnect GmbH
  • Aphy AG
  • CORGOS
  • Rekorder
  • SolidProof
  • Yonju
  • Keymate
  • Paritel
  • Mr. Clipart
  • Millenium
  • Negosh
  • Führerscheinmacher
  • BTI
  • Deutsche Gesellschaft für Datenschutz
Kundenstimmen ansehen

Anfrage

Twenty CRM produktionsreif einführen

Wir verbinden die technische Installation mit Rollen, Datenmodell und Migration, damit aus dem Tutorial ein belastbares CRM-System wird.

  • Direkt mit Timo und Robin - kein Vertrieb, kein Sales-Pitch
  • Fachliche Einschätzung Ihrer Situation
  • Konkrete nächste Schritte für Infrastruktur, Software oder KI

Das Gespräch ist unverbindlich und kostenlos.

Die Beratung von WZ-IT zu unserer Azure-Migration war schon im Erstgespräch fachlich sehr fundiert und völlig unverbindlich - wir haben eine Menge mitgenommen.
Jakob ÖschlbergerInno7 GmbH
Timo und Robin, Gründer von WZ-IT

Wie möchten Sie Twenty CRM einsetzen?

Die Beratung von WZ-IT zu unserer Azure-Migration war schon im Erstgespräch fachlich sehr fundiert und völlig unverbindlich - wir haben eine Menge mitgenommen.
Jakob ÖschlbergerInno7 GmbH