docs / invoices / getting-started / installation.md
Installation
Invoices ist die selbst gehostete App für Kontakte und KI-gestützte Rechnungen, nicht das entrytwo-Buchhaltungs-Ledger.
Das Quellcode-Repository ist öffentlich.
Es gibt kein veröffentlichtes Invoices-Docker-Image. Du baust das enthaltene
Dockerfile lokal. GitHub-Konto, Zugriffstoken und Registry-Login sind nicht
erforderlich. invoices:latest ist ein lokaler Image-Tag, kein Registry-Download.
Der Code steht unter einer proprietären Source-Available-Lizenz, nicht unter einer Open-Source-Lizenz. Einsehen, Klonen, Bauen und private Änderungen sind im Rahmen der Lizenz erlaubt. Die vollständige App ist 30 Tage kostenlos nutzbar; danach ist eine Invoices-Einmallizenz erforderlich. Ein entrytwo-Buchhaltungs-Key aktiviert Invoices nicht.
Installation mit KI-Unterstützung: Gib deinem Coding-Agenten diese Seite und den Invoices-Installations-Skill. Nenne das Ziel: lokal oder VPS mit Domain. Teile keine Secrets im Chat. Agenten dürfen installieren und konfigurieren; Käufe und Checkout bleiben beim Menschen.
Voraussetzungen
- Git, Docker und Docker Compose v2 oder neuer (auf macOS: Docker Desktop).
- Mindestens 2 GB RAM; für den Build auf dem Server sind 4 GB oder mehr sinnvoll.
- Funktionierendes SMTP und/oder Google-/Microsoft-OAuth für die Anmeldung. Für Rechnungs-E-Mails ist SMTP zusätzlich erforderlich.
- Für öffentlich erreichbare VPS: eine Domain mit korrektem DNS und ein HTTPS-Reverse-Proxy wie Caddy oder nginx.
- Optional: eigene KI-Zugangsdaten für Rechnungsentwürfe per Chat.
1. Quellcode klonen
git clone https://github.com/felixkrusch/invoices.git
cd invoices
cp .env.example .env
Halte .env privat. Überschreibe keine bestehende Installationskonfiguration.
2. Umgebung konfigurieren
Erzeuge getrennte Werte und trage sie in .env ein:
openssl rand -base64 48 # AUTH_SECRET
openssl rand -hex 32 # ENCRYPTION_KEY (für spätere Wiederherstellung sichern)
openssl rand -base64 48 # JOB_RUNNER_SECRET
openssl rand -base64 48 # UPDATER_TOKEN
openssl rand -hex 24 # POSTGRES_PASSWORD
AUTH_SECRET und JOB_RUNNER_SECRET brauchen mindestens 32 Zeichen;
ENCRYPTION_KEY genau 64 Hex-Zeichen. Compose wertet derzeit auch den optionalen
Updater-Service aus. Setze daher UPDATER_TOKEN, obwohl du den Updater nicht
aktivierst. Compose bildet die Datenbank-URL aus POSTGRES_PASSWORD; eine
PostgreSQL-Installation auf dem Host ist für diesen Weg nicht erforderlich.
Gemeinsame Einstellungen:
APP_IMAGE="invoices:latest"
APP_VERSION="dev"
UPDATER_URL=""
UPDATE_MANIFEST_URL=""
LICENSE_VERIFY_URL="https://entrytwo.com/api/license/verify"
AUTH_TRUST_HOST="true"
Notiere git rev-parse HEAD, um den gebauten Quellstand festzuhalten. Aktiviere
weder das Updater-Profil noch einen Update-Feed der entrytwo-Buchhaltungs-App.
Lokale Docker-Installation
Zum Beispiel Port 3001, damit entrytwo auf Port 3000 weiterlaufen kann:
APP_PORT="127.0.0.1:3001"
AUTH_URL="http://localhost:3001"
APP_PUBLIC_URL="http://localhost:3001"
AUTH_ALLOW_HTTP="true"
Docker startet die App auch auf dem Laptop im Produktionsmodus. Echtes
SMTP/OAuth und TOTP für Administratoren bleiben erforderlich; der sofortige
Entwickler-Login ist nicht verfügbar. AUTH_ALLOW_HTTP=true ist ausschließlich
eine Localhost-/Labor-Ausnahme, keine Einstellung für öffentliche Server.
Binde den Port wie oben nur an Loopback. Für native Node.js-Entwicklung siehe
SETUP.md im Repository.
VPS mit HTTPS
APP_PORT="127.0.0.1:3000"
AUTH_URL="https://invoices.example.com"
APP_PUBLIC_URL="https://invoices.example.com"
AUTH_ALLOW_HTTP="false"
Ersetze die Beispieldomain. DNS muss vor der Zertifikatsanforderung auf den VPS
zeigen. Der Proxy leitet HTTPS an 127.0.0.1:3000 weiter und übermittelt den
ursprünglichen Host und das HTTPS-Schema. PostgreSQL nicht öffentlich freigeben.
Anmeldung und E-Mail
Konfiguriere SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM
und/oder eine vollständige Google-/Microsoft-OAuth-Konfiguration aus
.env.example. Registriere beim Anbieter exakt den passenden Callback:
{AUTH_URL}/api/auth/callback/google{AUTH_URL}/api/auth/callback/microsoft-entra-id
OAuth allein genügt zur Anmeldung. Für Rechnungs-E-Mails sind SMTP und der Worker erforderlich. Optionale KI-/Zahlungs-Zugangsdaten bleiben leer, wenn du diese Integrationen nicht verwendest.
3. Lokal bauen und starten
Nach der Konfiguration von .env, im geklonten Repository:
docker compose -f compose.yaml pull db
docker compose -f compose.yaml build app
docker compose -f compose.yaml up -d --no-build --pull never app worker db
docker compose -f compose.yaml ps
Nur PostgreSQL wird aus einer öffentlichen Registry geladen. Die App wird
lokal gebaut; der Worker nutzt dasselbe lokale Image und startet erst nach
dem Build. Kein docker compose pull app worker ausführen. Der Entrypoint
wendet die Prisma-Migrationen an.
Für das lokale Beispiel:
curl --fail --silent --show-error http://localhost:3001/api/health
Auf dem VPS prüfst du stattdessen https://deine-domain/api/health. Erst bei
"ready": true und "status": "ok" fortfahren. Werte aus .env sind nicht
automatisch Shell-Variablen; APP_PORT kann außerdem die Bind-Adresse enthalten.
Nutze die echte URL, nicht ${APP_PORT:-3000} in curl-Befehlen.
Bei Startfehlern:
docker compose -f compose.yaml logs --tail=100 app worker
Fehlende Secrets, unvollständiges SMTP/OAuth oder eine HTTP-AUTH_URL ohne
explizite lokale Ausnahme verhindern den Produktionsstart. Authentifizierung
nicht abschalten und Datenbank-Volumes nicht als Fehlerbehebung löschen.
4. Erste Nutzung und Lizenz
Öffne die konfigurierte URL, lege den ersten ADMIN an, aktiviere TOTP und richte Firma, Steuersätze, Kontakt und Testrechnung ein. Prüfe PDF-Download und E-Mail-Zustellung. Der Worker muss laufen, sonst bleiben E-Mails in der Warteschlange.
Der 30-Tage-Test braucht keinen Key. Ein Mensch kauft unter
Invoices kaufen und aktiviert den Invoices-Key
im Lizenzdialog der App. Die authentifizierte Aktivierungs-API ist
POST /api/license/activate mit {"key":"et1.<payload>.<sig>"}. Die App sendet
einmalig product: invoices an den Verifizierungsdienst; die erfolgreiche
Aktivierung gilt dauerhaft für diese Installation.
Eine Invoices-Lizenz deckt Installationen für Unternehmen ab, die dir gehören. Jedes Unternehmen bekommt einen eigenen Stack mit eigener Datenbank. Fremde Mandanten benötigen eigene Lizenzen, auch wenn du ihre Server verwaltest.
Backups, Updates und mehrere Firmen
- Pro Firma: eigenes Verzeichnis,
COMPOSE_PROJECT_NAME, Port, Secrets, Datenbank und private Datei-Volumes. Invoices ist nicht mandantenfähig. .invbackupexportieren und extern sichern; den ursprünglichenENCRYPTION_KEYseparat sicher aufbewahren. Nicht mit entrytwo-.etbackupkompatibel. Wiederherstellung auf einer isolierten Installation testen.- Kein
docker compose down -v: Es löscht persistente Volumes. - Updates bedeuten derzeit: Quellstand prüfen, sichern,
appneu bauen und App und Worker neu erstellen. Es gibt keinen veröffentlichten Image-Feed für den In-App-Updater. Nutze die Quellcode-Update-Anleitung.
Weitere Betriebsdetails: Produktions-Checkliste und Authentifizierungs-Checkliste.
Volles Ledger? entrytwo-Installation.