On-Premise Installation

ContextDecay kann als Docker-Container auf Ihrem eigenen Server betrieben werden. Diese Anleitung beschreibt die Installation auf Ubuntu Server 22.04+ mit Docker.

Voraussetzungen

  • Ubuntu Server 22.04 LTS oder neuer
  • Mindestens 2 GB RAM, 2 CPU-Kerne, 20 GB Speicher
  • Docker und Docker Compose installiert
  • Eine Domain mit DNS-Eintrag auf den Server (z.B. decisions.ihrefirma.de)
  • Port 80 und 443 offen (für HTTPS)

1. Docker installieren

Falls Docker noch nicht installiert ist:

# Docker installieren
curl -fsSL https://get.docker.com | sh

# Docker Compose Plugin (in aktuellen Docker-Versionen enthalten)
docker compose version

# Aktuellen Benutzer zur Docker-Gruppe hinzufügen
sudo usermod -aG docker $USER

2. Verzeichnis anlegen

sudo mkdir -p /opt/contextdecay
cd /opt/contextdecay

3. Docker Compose Konfiguration

Erstellen Sie die Datei docker-compose.yml:

version: "3.8"

services:
  app:
    image: ghcr.io/net-evolution/contextdecay:latest
    container_name: contextdecay-app
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://contextdecay:${DB_PASSWORD}@db:5432/contextdecay
      - CG_JWT_SECRET=${JWT_SECRET}
      - CG_AUTH_MODE=builtin
      - CG_BASE_URL=https://decisions.ihrefirma.de
    env_file:
      - .env
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3000"]
      interval: 30s
      timeout: 5s
      retries: 3

  db:
    image: postgres:16-alpine
    container_name: contextdecay-db
    environment:
      - POSTGRES_USER=contextdecay
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=contextdecay
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U contextdecay"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  pgdata:

4. Umgebungsvariablen

Erstellen Sie die Datei .env:

# Datenbank-Passwort (bitte ändern)
DB_PASSWORD=ein-sicheres-passwort-hier

# JWT Secret (mindestens 64 Zeichen, zufällig generieren)
JWT_SECRET=$(openssl rand -base64 64 | tr -d '\n')

# Optional: SMTP für E-Mail-Benachrichtigungen
CG_SMTP_HOST=mail.ihrefirma.de
CG_SMTP_PORT=587
CG_SMTP_SECURE=false
CG_SMTP_USER=noreply@ihrefirma.de
CG_SMTP_PASSWORD=smtp-passwort
CG_SMTP_FROM=ContextDecay <noreply@ihrefirma.de>

Generieren Sie ein sicheres JWT-Secret:

openssl rand -base64 64 | tr -d '\n' > /dev/null
# Ausgabe in .env eintragen

5. Container starten

cd /opt/contextdecay
docker compose up -d

# Status prüfen
docker compose ps

# Logs ansehen
docker compose logs -f app

Nach ca. 10 Sekunden sollten beide Container als healthy angezeigt werden. Die App ist unter http://127.0.0.1:3000 erreichbar.

6. Reverse Proxy mit Nginx

Installieren Sie Nginx und Certbot für HTTPS:

sudo apt install nginx certbot python3-certbot-nginx -y

Erstellen Sie die Nginx-Konfiguration unter /etc/nginx/sites-available/contextdecay:

server {
    server_name decisions.ihrefirma.de;
    listen 80;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

Aktivieren und SSL einrichten:

sudo ln -s /etc/nginx/sites-available/contextdecay /etc/nginx/sites-enabled/
sudo nginx -t && sudo nginx -s reload

# SSL-Zertifikat holen
sudo certbot --nginx -d decisions.ihrefirma.de

7. Ersten Admin-Benutzer anlegen

Nach dem Start müssen Sie den ersten Benutzer über die Datenbank anlegen:

# Passwort-Hash generieren
HASH=$(docker exec contextdecay-app node -e "
  import('bcryptjs').then(b => b.hash('IhrPasswort', 12).then(h => console.log(h)))
")

# Benutzer anlegen
docker exec contextdecay-db psql -U contextdecay -d contextdecay -c "
  INSERT INTO users (email, name, password, auth_type, role_id, is_active)
  VALUES ('admin@ihrefirma.de', 'Admin', '$HASH', 'builtin', 'role-default-0', true);
"

Danach können Sie sich unter https://decisions.ihrefirma.de anmelden und weitere Benutzer über die Nutzerverwaltung einladen.

8. Updates

cd /opt/contextdecay

# Neues Image laden
docker compose pull

# Container mit neuem Image starten
docker compose up -d

# Alte Images aufräumen
docker image prune -f

9. Backup

Tägliches Datenbank-Backup einrichten:

# Backup-Script erstellen
cat > /opt/contextdecay/backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR=/opt/contextdecay/backups
mkdir -p $BACKUP_DIR
docker exec contextdecay-db pg_dump -U contextdecay contextdecay | gzip > $BACKUP_DIR/$(date +%Y-%m-%d).sql.gz
# Backups älter als 14 Tage löschen
find $BACKUP_DIR -name "*.sql.gz" -mtime +14 -delete
EOF

chmod +x /opt/contextdecay/backup.sh

# Cron-Job: täglich um 3:00 Uhr
(crontab -l 2>/dev/null; echo "0 3 * * * /opt/contextdecay/backup.sh") | crontab -

10. LDAP / EntraID konfigurieren (optional)

Für SSO fügen Sie die entsprechenden Variablen in die .env ein:

LDAP

CG_AUTH_MODE=ldap
CG_LDAP_URL=ldap://ldap.ihrefirma.de:389
CG_LDAP_BASE_DN=dc=ihrefirma,dc=de
CG_LDAP_BIND_DN=cn=readonly,dc=ihrefirma,dc=de
CG_LDAP_BIND_PASSWORD=ldap-passwort
CG_LDAP_USER_FILTER=(sAMAccountName={{username}})

Microsoft EntraID

CG_AUTH_MODE=entraid
CG_ENTRAID_CLIENT_ID=ihre-client-id
CG_ENTRAID_CLIENT_SECRET=ihr-client-secret
CG_ENTRAID_TENANT_ID=ihre-tenant-id

Nach Änderungen Container neu starten:

docker compose up -d

Systemanforderungen

KomponenteMinimumEmpfohlen
CPU2 Kerne4 Kerne
RAM2 GB4 GB
Speicher20 GB50 GB
OSUbuntu 22.04Ubuntu 24.04
Docker24.0+27.0+
PostgreSQL1516 (enthalten)

Fehlerbehebung

Container startet nicht

# Logs prüfen
docker compose logs app

# Häufige Ursache: DATABASE_URL falsch
# Prüfen ob DB erreichbar ist:
docker exec contextdecay-app wget -q -O- http://127.0.0.1:3000/api/ai-status

502 Bad Gateway

Nginx kann die App nicht erreichen. Prüfen Sie:

  • Läuft der Container? docker compose ps
  • Ist Port 3000 belegt? ss -tlnp | grep 3000
  • Nginx-Config korrekt? nginx -t

Datenbank-Verbindungsfehler

  • Passwort in .env und docker-compose.yml stimmen überein?
  • DB-Container healthy? docker compose ps db
  • Manuell verbinden: docker exec -it contextdecay-db psql -U contextdecay