nullish ist Open Source, du kannst es also auf deinen eigenen Servern laufen lassen. Hier steht, wie das mit Docker oder Podman geht.
Architektur
Abschnitt betitelt „Architektur“| Dienst | Image | Rolle |
|---|---|---|
postgres | postgres:18 | Die Datenbank. |
server | usenullish/server | Die API. Erledigt auch Hintergrundjobs und rendert PDFs. |
client | usenullish/client | Die Web-App. |
caddy | caddy:2 | Reverse 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.
Voraussetzungen
Abschnitt betitelt „Voraussetzungen“- Ein Server mit Docker oder Podman.
- Eine Domain, die darauf zeigt, z. B.
nullish.example.com.
Einrichten
Abschnitt betitelt „Einrichten“Erstelle einen Ordner mit einer
.env-Datei:Terminal-Fenster NULLISH_DB_USERNAME=nullishNULLISH_DB_PASSWORD=a-long-random-password# openssl rand -base64 32NULLISH_AUTH_SECRET=NULLISH_AUTH_URL=https://nullish.example.com/apiNULLISH_AUTH_SIGN_UP=invite_onlyFüge eine
docker-compose.ymlhinzu:services:postgres:image: postgres:18restart: unless-stoppedenvironment:POSTGRES_USER: ${NULLISH_DB_USERNAME}POSTGRES_PASSWORD: ${NULLISH_DB_PASSWORD}POSTGRES_DB: nullishvolumes:- postgres-data:/var/lib/postgresqlhealthcheck:test: ["CMD-SHELL", "pg_isready -U ${NULLISH_DB_USERNAME} -d nullish"]interval: 5stimeout: 5sretries: 10server:image: usenullish/server:0.1.0restart: unless-stoppeddepends_on:postgres:condition: service_healthyenvironment:NULLISH_DB_HOST: postgresNULLISH_DB_PORT: 5432NULLISH_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:/dataclient:image: usenullish/client:0.1.0restart: unless-stoppeddepends_on:- serverenvironment:NULLISH_API_URL: http://server:3000caddy:image: caddy:2restart: unless-stoppedports:- "80:80"- "443:443"volumes:- ./Caddyfile:/etc/caddy/Caddyfile- caddy-data:/datavolumes:postgres-data:nullish-data:caddy-data:Füge ein
Caddyfilehinzu:nullish.example.com {handle_path /api/* {reverse_proxy server:3000}handle {reverse_proxy client:3000}}Starte alles:
Terminal-Fenster docker compose up -dÖ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.
Konfiguration
Abschnitt betitelt „Konfiguration“Datenbank
Abschnitt betitelt „Datenbank“| Variable | Pflicht | Beschreibung |
|---|---|---|
NULLISH_DB_HOST | ja | Datenbank-Host. |
NULLISH_DB_PORT | ja | Datenbank-Port. |
NULLISH_DB_USERNAME | ja | Datenbank-Benutzer. |
NULLISH_DB_PASSWORD | ja | Datenbank-Passwort. |
NULLISH_DB_NAME | nein | Datenbankname. Standard nullish. |
Authentifizierung
Abschnitt betitelt „Authentifizierung“| Variable | Pflicht | Beschreibung |
|---|---|---|
NULLISH_AUTH_SECRET | ja | Mindestens 32 Zeichen. Generiere es mit openssl rand -base64 32. |
NULLISH_AUTH_URL | ja | Öffentliche URL der API. |
NULLISH_AUTH_SIGN_UP | nein | true (alle), false (niemand) oder invite_only (mit einer Einladung in eine Organisation). Standard invite_only. |
Den Assistenten aktivieren
Abschnitt betitelt „Den Assistenten aktivieren“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:
NULLISH_LLM_URL=http://ollama:11434/v1NULLISH_LLM_CHAT_MODEL=qwen3.5:4bNULLISH_LLM_API_KEY=ollamaReich 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.
| Variable | Pflicht | Beschreibung |
|---|---|---|
NULLISH_LLM_URL | für den Assistenten | Basis-URL des Endpunkts, z. B. http://ollama:11434/v1. |
NULLISH_LLM_CHAT_MODEL | für den Assistenten | Modellname. |
NULLISH_LLM_API_KEY | für den Assistenten | API-Schlüssel. Darf nicht leer sein, auch nicht für Ollama. |
NULLISH_LLM_CHAT_TOKEN_LIMIT | nein | Tokens pro Benutzer und Periode. Unbegrenzt, wenn nicht gesetzt. |
NULLISH_LLM_CHAT_TOKEN_LIMIT_PERIOD | nein | hourly, daily, weekly oder monthly. Standard weekly. |
Betrieb
Abschnitt betitelt „Betrieb“- Updates: Pass die Version beider Images in der
docker-compose.ymlan, danndocker compose pull && docker compose up -d. Migrationen laufen beim Start automatisch. - Backups: Sichere die Datenbank, z. B. mit
pg_dump. - Health:
GET /api/healthliefert{"status":"ok"}. - Logs:
docker compose logs -f server.
Kommandozeile
Abschnitt betitelt „Kommandozeile“Das Server-Image enthält eine kleine CLI:
# List users and their organizationsdocker compose exec server ./cli user list
# Permanently delete the organizations marked as deleteddocker compose exec server ./cli organization delete --dry-runOrganisationen, die als gelöscht markiert sind, werden erst endgültig gelöscht, wenn du organization delete ausführst.