Zum Inhalt springen

Self-Hosting

nullish ist Open Source, du kannst es also auf deinen eigenen Servern laufen lassen. Hier steht, wie das mit Docker oder Podman geht.

DienstImageRolle
postgrespostgres:18Die Datenbank.
serverusenullish/serverDie API. Erledigt auch Hintergrundjobs und rendert PDFs.
clientusenullish/clientDie Web-App.
caddycaddy:2Reverse Proxy: HTTPS, und /api zum Server.

Dateien wie generierte PDFs liegen nur vorübergehend im /data-Volume des Servers und werden regelmässig gelöscht. Alles andere steckt in der Datenbank.

Die Images liegen auf Docker Hub, für linux/amd64 und linux/arm64, getaggt mit latest und der Version, z. B. 0.1.0, 0.1 oder 0. Pinne eine Version, dann aktualisierst du, wann es dir passt.

  • Ein Server mit Docker oder Podman.
  • Eine Domain, die darauf zeigt, z. B. nullish.example.com.
  1. Erstelle einen Ordner mit einer .env-Datei:

    Terminal-Fenster
    NULLISH_DB_USERNAME=nullish
    NULLISH_DB_PASSWORD=a-long-random-password
    # openssl rand -base64 32
    NULLISH_AUTH_SECRET=
    NULLISH_AUTH_URL=https://nullish.example.com/api
    NULLISH_AUTH_SIGN_UP=invite_only
  2. Füge eine docker-compose.yml hinzu:

    services:
    postgres:
    image: postgres:18
    restart: unless-stopped
    environment:
    POSTGRES_USER: ${NULLISH_DB_USERNAME}
    POSTGRES_PASSWORD: ${NULLISH_DB_PASSWORD}
    POSTGRES_DB: nullish
    volumes:
    - postgres-data:/var/lib/postgresql
    healthcheck:
    test: ["CMD-SHELL", "pg_isready -U ${NULLISH_DB_USERNAME} -d nullish"]
    interval: 5s
    timeout: 5s
    retries: 10
    server:
    image: usenullish/server:0.1.0
    restart: unless-stopped
    depends_on:
    postgres:
    condition: service_healthy
    environment:
    NULLISH_DB_HOST: postgres
    NULLISH_DB_PORT: 5432
    NULLISH_DB_USERNAME: ${NULLISH_DB_USERNAME}
    NULLISH_DB_PASSWORD: ${NULLISH_DB_PASSWORD}
    NULLISH_AUTH_SECRET: ${NULLISH_AUTH_SECRET}
    NULLISH_AUTH_URL: ${NULLISH_AUTH_URL}
    NULLISH_AUTH_SIGN_UP: ${NULLISH_AUTH_SIGN_UP}
    volumes:
    - nullish-data:/data
    client:
    image: usenullish/client:0.1.0
    restart: unless-stopped
    depends_on:
    - server
    environment:
    NULLISH_API_URL: http://server:3000
    caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - ./Caddyfile:/etc/caddy/Caddyfile
    - caddy-data:/data
    volumes:
    postgres-data:
    nullish-data:
    caddy-data:
  3. Füge ein Caddyfile hinzu:

    nullish.example.com {
    handle_path /api/* {
    reverse_proxy server:3000
    }
    handle {
    reverse_proxy client:3000
    }
    }
  4. Starte alles:

    Terminal-Fenster
    docker compose up -d
  5. Öffne deine Domain und registriere dich. Die erste Registrierung klappt immer, egal wie die Registrierung eingestellt ist. Erstelle deine Organisation, und du bist ihr Admin.

VariablePflichtBeschreibung
NULLISH_DB_HOSTjaDatenbank-Host.
NULLISH_DB_PORTjaDatenbank-Port.
NULLISH_DB_USERNAMEjaDatenbank-Benutzer.
NULLISH_DB_PASSWORDjaDatenbank-Passwort.
NULLISH_DB_NAMEneinDatenbankname. Standard nullish.
VariablePflichtBeschreibung
NULLISH_AUTH_SECRETjaMindestens 32 Zeichen. Generiere es mit openssl rand -base64 32.
NULLISH_AUTH_URLjaÖffentliche URL der API.
NULLISH_AUTH_SIGN_UPneintrue (alle), false (niemand) oder invite_only (mit einer Einladung in eine Organisation). Standard invite_only.

Der Assistent braucht ein LLM. Jeder OpenAI-kompatible Endpunkt funktioniert, etwa dein eigenes Modell mit Ollama oder ein Anbieter deiner Wahl. Ohne LLM läuft nullish problemlos, nur ist der Assistent dann deaktiviert.

Ergänze deine .env um diese Einstellungen:

Terminal-Fenster
NULLISH_LLM_URL=http://ollama:11434/v1
NULLISH_LLM_CHAT_MODEL=qwen3.5:4b
NULLISH_LLM_API_KEY=ollama

Reich sie in der docker-compose.yml an den Server durch:

server:
environment:
NULLISH_LLM_URL: ${NULLISH_LLM_URL}
NULLISH_LLM_CHAT_MODEL: ${NULLISH_LLM_CHAT_MODEL}
NULLISH_LLM_API_KEY: ${NULLISH_LLM_API_KEY}

Dann neu starten mit docker compose up -d. Sobald die ersten drei Einstellungen unten gesetzt sind, ist der Assistent aktiv.

VariablePflichtBeschreibung
NULLISH_LLM_URLfür den AssistentenBasis-URL des Endpunkts, z. B. http://ollama:11434/v1.
NULLISH_LLM_CHAT_MODELfür den AssistentenModellname.
NULLISH_LLM_API_KEYfür den AssistentenAPI-Schlüssel. Darf nicht leer sein, auch nicht für Ollama.
NULLISH_LLM_CHAT_TOKEN_LIMITneinTokens pro Benutzer und Periode. Unbegrenzt, wenn nicht gesetzt.
NULLISH_LLM_CHAT_TOKEN_LIMIT_PERIODneinhourly, daily, weekly oder monthly. Standard weekly.
  • Updates: Pass die Version beider Images in der docker-compose.yml an, dann docker compose pull && docker compose up -d. Migrationen laufen beim Start automatisch.
  • Backups: Sichere die Datenbank, z. B. mit pg_dump.
  • Health: GET /api/health liefert {"status":"ok"}.
  • Logs: docker compose logs -f server.

Das Server-Image enthält eine kleine CLI:

Terminal-Fenster
# List users and their organizations
docker compose exec server ./cli user list
# Permanently delete the organizations marked as deleted
docker compose exec server ./cli organization delete --dry-run

Organisationen, die als gelöscht markiert sind, werden erst endgültig gelöscht, wenn du organization delete ausführst.